virt_test/bin/python testrunner/runner.py --logfile=testrun.log --config=pypy/testrunner_cfg.py '--config=~/machine_cfg.py' --root=pypy --timeout=4000 in dir /build_dir/own-linux-aarch64/build (timeout 4000 secs) watching logfiles {'pytestLog': 'testrun.log'} argv: ['virt_test/bin/python', 'testrunner/runner.py', '--logfile=testrun.log', '--config=pypy/testrunner_cfg.py', '--config=~/machine_cfg.py', '--root=pypy', '--timeout=4000'] environment: AUDITWHEEL_ARCH=aarch64 AUDITWHEEL_PLAT=manylinux2014_aarch64 AUDITWHEEL_POLICY=manylinux2014 DEVTOOLSET_ROOTPATH=/opt/rh/devtoolset-10/root HOME=/home/buildslave HOSTNAME=530e0d063b5c LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8 LC_ALL=en_US.UTF-8 LD_LIBRARY_PATH=/usr/local/lib:/opt/rh/devtoolset-10/root/usr/lib64:/opt/rh/devtoolset-10/root/usr/lib:/opt/rh/devtoolset-10/root/usr/lib64/dyninst:/opt/rh/devtoolset-10/root/usr/lib/dyninst:/usr/local/lib64 LOGNAME=buildslave PATH=/python27_virt/bin:/opt/rh/devtoolset-10/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig PWD=/build_dir/own-linux-aarch64/build PYPYCHERRYPICK= PYPY_GC_NURSERY=16M PYPY_LOCALBASE=/usr/local PYPY_MAKE_PORTABLE=1 PYTHONPATH=.: SHELL=/bin/bash SHLVL=2 SSL_CERT_FILE=/opt/_internal/certs.pem TERM=xterm TMPDIR=/tmp/pytest USER=buildslave _=/python27_virt/bin/buildslave using PTY: False using config pypy/testrunner_cfg.py using config /home/buildslave/machine_cfg.py running 4 parallel test workers setting MAKEFLAGS to ' ' (space) -- config/test -- interpreter/astcompiler/test -- interpreter/pyparser/test -- interpreter/test -- module/__builtin__/test -- module/__pypy__/test -- module/_ast/test -- module/_cffi_backend/test -- module/_codecs/test -- module/_continuation/test -- module/_cppyy/test -- module/_csv/test -- module/_demo/test -- module/_file/test -- module/_io/test -- module/_jitlog/test -- module/_locale/test -- module/_lsprof/test -- module/_md5/test -- module/_minimal_curses/test -- module/_multibytecodec/test -- module/_multiprocessing/test -- module/_pypyjson/test -- module/_random/test -- module/_rawffi/alt/test -- module/_rawffi/test -- module/_sha/test -- module/_socket/test -- module/_sre/test -- module/_vmprof/test -- module/_warnings/test -- module/_weakref/test -- module/_winreg/test -- module/array/test -- module/binascii/test -- module/bz2/test -- module/cStringIO/test -- module/cmath/test -- module/cpyext/test/test_abstract.py -- module/cpyext/test/test_api.py -- module/cpyext/test/test_arraymodule.py -- module/cpyext/test/test_boolobject.py -- module/cpyext/test/test_borrow.py -- module/cpyext/test/test_bufferobject.py -- module/cpyext/test/test_bytearrayobject.py -- module/cpyext/test/test_bytesobject.py -- module/cpyext/test/test_capsule.py -- module/cpyext/test/test_cell.py -- module/cpyext/test/test_classobject.py -- module/cpyext/test/test_codecs.py -- module/cpyext/test/test_complexobject.py -- module/cpyext/test/test_cpyext.py -- module/cpyext/test/test_datetime.py -- module/cpyext/test/test_dictobject.py -- module/cpyext/test/test_eval.py -- module/cpyext/test/test_fileobject.py -- module/cpyext/test/test_floatobject.py -- module/cpyext/test/test_frameobject.py -- module/cpyext/test/test_funcobject.py -- module/cpyext/test/test_genobject.py -- module/cpyext/test/test_getargs.py -- module/cpyext/test/test_import.py -- module/cpyext/test/test_intobject.py -- module/cpyext/test/test_iterator.py -- module/cpyext/test/test_listobject.py -- module/cpyext/test/test_longobject.py -- module/cpyext/test/test_mapping.py -- module/cpyext/test/test_marshal.py -- module/cpyext/test/test_memoryobject.py -- module/cpyext/test/test_methodobject.py -- module/cpyext/test/test_misc.py -- module/cpyext/test/test_module.py -- module/cpyext/test/test_ndarrayobject.py -- module/cpyext/test/test_number.py -- module/cpyext/test/test_object.py -- module/cpyext/test/test_pycobject.py -- module/cpyext/test/test_pyerrors.py -- module/cpyext/test/test_pyfile.py -- module/cpyext/test/test_pysignals.py -- module/cpyext/test/test_pystate.py -- module/cpyext/test/test_pystrtod.py -- module/cpyext/test/test_sequence.py -- module/cpyext/test/test_setobject.py -- module/cpyext/test/test_sliceobject.py -- module/cpyext/test/test_structseq.py -- module/cpyext/test/test_sysmodule.py -- module/cpyext/test/test_thread.py -- module/cpyext/test/test_traceback.py -- module/cpyext/test/test_translate.py -- module/cpyext/test/test_tupleobject.py -- module/cpyext/test/test_typeobject.py -- module/cpyext/test/test_unicodeobject.py -- module/cpyext/test/test_userslots.py -- module/cpyext/test/test_version.py -- module/cpyext/test/test_weakref.py -- module/crypt/test -- module/errno/test -- module/exceptions/test -- module/faulthandler/test -- module/fcntl/test -- module/gc/test -- module/imp/test -- module/itertools/test -- module/marshal/test -- module/math/test -- module/micronumpy/test -- module/mmap/test -- module/operator/test -- module/parser/test -- module/posix/test -- module/pwd/test -- module/pyexpat/test -- module/pypyjit/test -- module/select/test -- module/signal/test -- module/struct/test -- module/sys/test -- module/termios/test -- module/test_lib_pypy -- module/thread/test -- module/time/test -- module/unicodedata/test -- module/zipimport/test -- module/zlib/test -- objspace/fake/test -- objspace/std/test -- objspace/test -- sandbox/test -- tool/bench/test -- tool/memusage/test -- tool/pytest/test -- tool/release/test -- tool/test -- total: 133 to run ++ 21:13:23 starting config/test [1 started in total] ++ 21:13:23 starting interpreter/astcompiler/test [2 started in total] ++ 21:13:23 starting interpreter/pyparser/test [3 started in total] ++ 21:13:23 starting interpreter/test [4 started in total] __ config/test [1 done in total, somefailed=False] ____________________________ ============================= test session starts ============================== platform linux2 -- Python 2.7.18, pytest-2.9.2, py-1.4.29, pluggy-0.3.1 hypothesis profile 'default' -> deadline=None, database=DirectoryBasedExampleDatabase('/build_dir/own-linux-aarch64/build/pypy/.hypothesis/examples') pytest-2.9.2 from /build_dir/own-linux-aarch64/build/pytest.pyc rootdir: /build_dir/own-linux-aarch64/build, inifile: pytest.ini plugins: hypothesis-4.39.3 collected 157 items / 1 skipped config/test/test_pypyoption.py ............................................................................................................................................................. ==================== 157 passed, 1 skipped in 7.86 seconds ===================== ++ 21:13:34 starting module/__builtin__/test [5 started in total] __ interpreter/pyparser/test [2 done in total, somefailed=True] _______________ ============================= test session starts ============================== platform linux2 -- Python 2.7.18, pytest-2.9.2, py-1.4.29, pluggy-0.3.1 hypothesis profile 'default' -> deadline=None, database=DirectoryBasedExampleDatabase('/build_dir/own-linux-aarch64/build/pypy/.hypothesis/examples') pytest-2.9.2 from /build_dir/own-linux-aarch64/build/pytest.py rootdir: /build_dir/own-linux-aarch64/build, inifile: pytest.ini plugins: hypothesis-4.39.3 collected 119 items interpreter/pyparser/test/test_automata.py ... interpreter/pyparser/test/test_future.py ..................................... interpreter/pyparser/test/test_gendfa.py . interpreter/pyparser/test/test_metaparser.py EEEEEEEEEEEEEEE interpreter/pyparser/test/test_parser.py .EEEEEEEEEEEE interpreter/pyparser/test/test_parsestring.py EEEEEEEEE interpreter/pyparser/test/test_pyparse.py EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE interpreter/pyparser/test/test_pytokenizer.py EEEEE ==================================== ERRORS ==================================== __________ ERROR at setup of TestParserGenerator.test_multiple_rules ___________ item = <Function 'test_multiple_rules'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_72.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_72.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_72.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_72.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_72.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_72.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_72.c:143: E /tmp/pytest/usession-main-1193/platcheck_72.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_72.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_72.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_72.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_72.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_72.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_72.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_72.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_72.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_72.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_72.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of TestParserGenerator.test_simple _______________ item = <Function 'test_simple'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_73.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_73.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_73.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_73.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_73.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_73.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_73.c:143: E /tmp/pytest/usession-main-1193/platcheck_73.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_73.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_73.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_73.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_73.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_73.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_73.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_73.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_73.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_73.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_73.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______ ERROR at setup of TestParserGenerator.test_load_python_grammars ________ item = <Function 'test_load_python_grammars'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_74.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_74.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_74.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_74.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_74.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_74.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_74.c:143: E /tmp/pytest/usession-main-1193/platcheck_74.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_74.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_74.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_74.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_74.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_74.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_74.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_74.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_74.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_74.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_74.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestParserGenerator.test_items _______________ item = <Function 'test_items'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_75.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_75.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_75.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_75.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_75.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_75.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_75.c:143: E /tmp/pytest/usession-main-1193/platcheck_75.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_75.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_75.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_75.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_75.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_75.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_75.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_75.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_75.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_75.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_75.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of TestParserGenerator.test_alternatives ____________ item = <Function 'test_alternatives'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_76.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_76.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_76.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_76.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_76.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_76.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_76.c:143: E /tmp/pytest/usession-main-1193/platcheck_76.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_76.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_76.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_76.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_76.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_76.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_76.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_76.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_76.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_76.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_76.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestParserGenerator.test_optional ______________ item = <Function 'test_optional'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_77.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_77.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_77.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_77.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_77.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_77.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_77.c:143: E /tmp/pytest/usession-main-1193/platcheck_77.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_77.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_77.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_77.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_77.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_77.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_77.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_77.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_77.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_77.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_77.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________ ERROR at setup of TestParserGenerator.test_optional_repeater _________ item = <Function 'test_optional_repeater'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_78.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_78.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_78.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_78.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_78.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_78.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_78.c:143: E /tmp/pytest/usession-main-1193/platcheck_78.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_78.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_78.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_78.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_78.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_78.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_78.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_78.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_78.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_78.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_78.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestParserGenerator.test_grouping ______________ item = <Function 'test_grouping'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_79.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_79.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_79.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_79.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_79.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_79.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_79.c:143: E /tmp/pytest/usession-main-1193/platcheck_79.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_79.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_79.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_79.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_79.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_79.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_79.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_79.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_79.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_79.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_79.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of TestParserGenerator.test_keyword ______________ item = <Function 'test_keyword'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_80.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_80.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_80.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_80.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_80.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_80.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_80.c:143: E /tmp/pytest/usession-main-1193/platcheck_80.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_80.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_80.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_80.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_80.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_80.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_80.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_80.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_80.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_80.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_80.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestParserGenerator.test_token _______________ item = <Function 'test_token'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_81.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_81.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_81.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_81.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_81.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_81.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_81.c:143: E /tmp/pytest/usession-main-1193/platcheck_81.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_81.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_81.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_81.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_81.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_81.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_81.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_81.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_81.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_81.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_81.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestParserGenerator.test_operator ______________ item = <Function 'test_operator'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_82.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_82.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_82.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_82.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_82.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_82.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_82.c:143: E /tmp/pytest/usession-main-1193/platcheck_82.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_82.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_82.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_82.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_82.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_82.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_82.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_82.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_82.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_82.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_82.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of TestParserGenerator.test_symbol _______________ item = <Function 'test_symbol'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_83.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_83.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_83.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_83.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_83.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_83.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_83.c:143: E /tmp/pytest/usession-main-1193/platcheck_83.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_83.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_83.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_83.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_83.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_83.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_83.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_83.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_83.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_83.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_83.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestParserGenerator.test_repeaters _____________ item = <Function 'test_repeaters'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_84.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_84.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_84.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_84.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_84.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_84.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_84.c:143: E /tmp/pytest/usession-main-1193/platcheck_84.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_84.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_84.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_84.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_84.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_84.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_84.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_84.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_84.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_84.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_84.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestParserGenerator.test_error _______________ item = <Function 'test_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_85.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_85.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_85.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_85.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_85.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_85.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_85.c:143: E /tmp/pytest/usession-main-1193/platcheck_85.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_85.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_85.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_85.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_85.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_85.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_85.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_85.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_85.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_85.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_85.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______ ERROR at setup of TestParserGenerator.test_comments_and_whitespace ______ item = <Function 'test_comments_and_whitespace'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_86.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_86.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_86.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_86.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_86.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_86.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_86.c:143: E /tmp/pytest/usession-main-1193/platcheck_86.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_86.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_86.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_86.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_86.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_86.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_86.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_86.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_86.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_86.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_86.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestParser.test_multiple_rules _______________ item = <Function 'test_multiple_rules'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_87.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_87.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_87.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_87.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_87.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_87.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_87.c:143: E /tmp/pytest/usession-main-1193/platcheck_87.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_87.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_87.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_87.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_87.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_87.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_87.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_87.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_87.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_87.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_87.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestParser.test_recursive_rule _______________ item = <Function 'test_recursive_rule'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_88.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_88.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_88.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_88.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_88.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_88.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_88.c:143: E /tmp/pytest/usession-main-1193/platcheck_88.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_88.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_88.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_88.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_88.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_88.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_88.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_88.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_88.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_88.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_88.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________________ ERROR at setup of TestParser.test_symbol ___________________ item = <Function 'test_symbol'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_89.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_89.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_89.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_89.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_89.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_89.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_89.c:143: E /tmp/pytest/usession-main-1193/platcheck_89.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_89.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_89.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_89.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_89.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_89.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_89.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_89.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_89.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_89.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_89.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________________ ERROR at setup of TestParser.test_token ____________________ item = <Function 'test_token'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_90.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_90.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_90.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_90.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_90.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_90.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_90.c:143: E /tmp/pytest/usession-main-1193/platcheck_90.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_90.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_90.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_90.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_90.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_90.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_90.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_90.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_90.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_90.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_90.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of TestParser.test_optional __________________ item = <Function 'test_optional'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_91.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_91.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_91.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_91.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_91.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_91.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_91.c:143: E /tmp/pytest/usession-main-1193/platcheck_91.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_91.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_91.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_91.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_91.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_91.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_91.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_91.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_91.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_91.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_91.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of TestParser.test_grouping __________________ item = <Function 'test_grouping'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_92.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_92.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_92.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_92.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_92.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_92.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_92.c:143: E /tmp/pytest/usession-main-1193/platcheck_92.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_92.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_92.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_92.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_92.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_92.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_92.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_92.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_92.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_92.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_92.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of TestParser.test_alternative _________________ item = <Function 'test_alternative'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_93.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_93.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_93.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_93.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_93.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_93.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_93.c:143: E /tmp/pytest/usession-main-1193/platcheck_93.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_93.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_93.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_93.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_93.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_93.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_93.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_93.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_93.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_93.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_93.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of TestParser.test_keyword ___________________ item = <Function 'test_keyword'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_94.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_94.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_94.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_94.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_94.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_94.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_94.c:143: E /tmp/pytest/usession-main-1193/platcheck_94.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_94.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_94.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_94.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_94.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_94.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_94.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_94.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_94.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_94.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_94.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of TestParser.test_repeaters __________________ item = <Function 'test_repeaters'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_95.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_95.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_95.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_95.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_95.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_95.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_95.c:143: E /tmp/pytest/usession-main-1193/platcheck_95.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_95.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_95.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_95.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_95.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_95.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_95.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_95.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_95.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_95.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_95.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestParser.test_optimized_terminal _____________ item = <Function 'test_optimized_terminal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_96.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_96.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_96.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_96.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_96.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_96.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_96.c:143: E /tmp/pytest/usession-main-1193/platcheck_96.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_96.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_96.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_96.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_96.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_96.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_96.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_96.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_96.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_96.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_96.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of TestParser.test_error_string ________________ item = <Function 'test_error_string'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_97.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_97.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_97.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_97.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_97.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_97.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_97.c:143: E /tmp/pytest/usession-main-1193/platcheck_97.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_97.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_97.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_97.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_97.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_97.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_97.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_97.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_97.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_97.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_97.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________ ERROR at setup of TestParser.test_line_attached_to_terminal __________ item = <Function 'test_line_attached_to_terminal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_98.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_98.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_98.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_98.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_98.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_98.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_98.c:143: E /tmp/pytest/usession-main-1193/platcheck_98.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_98.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_98.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_98.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_98.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_98.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_98.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_98.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_98.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_98.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_98.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of TestParsetring.test_simple _________________ item = <Function 'test_simple'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_99.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_99.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_99.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_99.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_99.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_99.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_99.c:143: E /tmp/pytest/usession-main-1193/platcheck_99.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_99.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_99.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_99.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_99.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_99.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_99.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_99.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_99.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_99.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_99.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of TestParsetring.test_unicode _________________ item = <Function 'test_unicode'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_100.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_100.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_100.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_100.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_100.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_100.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_100.c:143: E /tmp/pytest/usession-main-1193/platcheck_100.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_100.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_100.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_100.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_100.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_100.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_100.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_100.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_100.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_100.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_100.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of TestParsetring.test_unicode_literals ____________ item = <Function 'test_unicode_literals'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_101.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_101.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_101.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_101.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_101.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_101.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_101.c:143: E /tmp/pytest/usession-main-1193/platcheck_101.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_101.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_101.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_101.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_101.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_101.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_101.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_101.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_101.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_101.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_101.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of TestParsetring.test_bytes __________________ item = <Function 'test_bytes'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_102.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_102.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_102.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_102.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_102.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_102.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_102.c:143: E /tmp/pytest/usession-main-1193/platcheck_102.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_102.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_102.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_102.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_102.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_102.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_102.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_102.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_102.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_102.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_102.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestParsetring.test_simple_enc_roundtrip __________ item = <Function 'test_simple_enc_roundtrip'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_103.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_103.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_103.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_103.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_103.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_103.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_103.c:143: E /tmp/pytest/usession-main-1193/platcheck_103.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_103.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_103.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_103.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_103.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_103.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_103.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_103.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_103.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_103.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_103.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ERROR at setup of TestParsetring.test_multiline_unicode_strings_with_backslash item = <Function 'test_multiline_unicode_strings_with_backslash'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_104.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_104.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_104.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_104.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_104.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_104.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_104.c:143: E /tmp/pytest/usession-main-1193/platcheck_104.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_104.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_104.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_104.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_104.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_104.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_104.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_104.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_104.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_104.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_104.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of TestParsetring.test_bug1 __________________ item = <Function 'test_bug1'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_105.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_105.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_105.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_105.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_105.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_105.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_105.c:143: E /tmp/pytest/usession-main-1193/platcheck_105.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_105.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_105.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_105.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_105.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_105.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_105.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_105.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_105.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_105.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_105.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________ ERROR at setup of TestParsetring.test_wide_unicode_in_source _________ item = <Function 'test_wide_unicode_in_source'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_106.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_106.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_106.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_106.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_106.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_106.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_106.c:143: E /tmp/pytest/usession-main-1193/platcheck_106.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_106.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_106.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_106.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_106.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_106.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_106.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_106.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_106.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_106.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_106.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestParsetring.test_decode_unicode_utf8 ___________ item = <Function 'test_decode_unicode_utf8'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_107.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_107.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_107.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_107.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_107.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_107.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_107.c:143: E /tmp/pytest/usession-main-1193/platcheck_107.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_107.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_107.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_107.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_107.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_107.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_107.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_107.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_107.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_107.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_107.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestPythonParser.test_with_and_as ______________ item = <Function 'test_with_and_as'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_108.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_108.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_108.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_108.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_108.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_108.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_108.c:143: E /tmp/pytest/usession-main-1193/platcheck_108.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_108.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_108.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_108.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_108.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_108.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_108.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_108.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_108.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_108.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_108.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParser.test_dont_imply_dedent ___________ item = <Function 'test_dont_imply_dedent'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_109.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_109.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_109.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_109.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_109.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_109.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_109.c:143: E /tmp/pytest/usession-main-1193/platcheck_109.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_109.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_109.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_109.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_109.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_109.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_109.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_109.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_109.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_109.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_109.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestPythonParser.test_clear_state ______________ item = <Function 'test_clear_state'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_110.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_110.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_110.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_110.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_110.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_110.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_110.c:143: E /tmp/pytest/usession-main-1193/platcheck_110.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_110.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_110.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_110.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_110.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_110.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_110.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_110.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_110.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_110.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_110.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestPythonParser.test_encoding _______________ item = <Function 'test_encoding'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_111.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_111.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_111.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_111.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_111.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_111.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_111.c:143: E /tmp/pytest/usession-main-1193/platcheck_111.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_111.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_111.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_111.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_111.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_111.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_111.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_111.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_111.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_111.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_111.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParser.test_non_unicode_codec ___________ item = <Function 'test_non_unicode_codec'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_112.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_112.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_112.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_112.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_112.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_112.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_112.c:143: E /tmp/pytest/usession-main-1193/platcheck_112.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_112.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_112.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_112.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_112.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_112.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_112.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_112.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_112.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_112.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_112.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestPythonParser.test_syntax_error _____________ item = <Function 'test_syntax_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_113.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_113.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_113.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_113.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_113.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_113.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_113.c:143: E /tmp/pytest/usession-main-1193/platcheck_113.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_113.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_113.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_113.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_113.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_113.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_113.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_113.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_113.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_113.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_113.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of TestPythonParser.test_is __________________ item = <Function 'test_is'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_114.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_114.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_114.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_114.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_114.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_114.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_114.c:143: E /tmp/pytest/usession-main-1193/platcheck_114.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_114.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_114.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_114.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_114.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_114.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_114.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_114.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_114.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_114.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_114.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParser.test_indentation_error ___________ item = <Function 'test_indentation_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_115.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_115.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_115.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_115.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_115.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_115.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_115.c:143: E /tmp/pytest/usession-main-1193/platcheck_115.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_115.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_115.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_115.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_115.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_115.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_115.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_115.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_115.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_115.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_115.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of TestPythonParser.test_mac_newline ______________ item = <Function 'test_mac_newline'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_116.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_116.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_116.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_116.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_116.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_116.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_116.c:143: E /tmp/pytest/usession-main-1193/platcheck_116.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_116.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_116.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_116.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_116.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_116.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_116.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_116.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_116.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_116.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_116.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of TestPythonParser.test_mode _________________ item = <Function 'test_mode'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_117.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_117.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_117.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_117.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_117.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_117.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_117.c:143: E /tmp/pytest/usession-main-1193/platcheck_117.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_117.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_117.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_117.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_117.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_117.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_117.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_117.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_117.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_117.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_117.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of TestPythonParser.test_multiline_string ___________ item = <Function 'test_multiline_string'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_118.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_118.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_118.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_118.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_118.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_118.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_118.c:143: E /tmp/pytest/usession-main-1193/platcheck_118.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_118.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_118.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_118.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_118.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_118.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_118.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_118.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_118.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_118.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_118.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of TestPythonParser.test_bytes_literal _____________ item = <Function 'test_bytes_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_119.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_119.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_119.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_119.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_119.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_119.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_119.c:143: E /tmp/pytest/usession-main-1193/platcheck_119.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_119.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_119.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_119.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_119.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_119.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_119.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_119.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_119.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_119.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_119.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParser.test_new_octal_literal ___________ item = <Function 'test_new_octal_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_120.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_120.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_120.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_120.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_120.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_120.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_120.c:143: E /tmp/pytest/usession-main-1193/platcheck_120.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_120.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_120.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_120.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_120.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_120.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_120.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_120.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_120.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_120.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_120.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParser.test_new_binary_literal __________ item = <Function 'test_new_binary_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_121.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_121.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_121.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_121.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_121.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_121.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_121.c:143: E /tmp/pytest/usession-main-1193/platcheck_121.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_121.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_121.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_121.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_121.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_121.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_121.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_121.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_121.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_121.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_121.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of TestPythonParser.test_print_function ____________ item = <Function 'test_print_function'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_122.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_122.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_122.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_122.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_122.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_122.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_122.c:143: E /tmp/pytest/usession-main-1193/platcheck_122.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_122.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_122.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_122.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_122.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_122.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_122.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_122.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_122.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_122.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_122.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParser.test_universal_newlines __________ item = <Function 'test_universal_newlines'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_123.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_123.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_123.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_123.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_123.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_123.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_123.c:143: E /tmp/pytest/usession-main-1193/platcheck_123.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_123.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_123.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_123.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_123.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_123.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_123.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_123.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_123.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_123.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_123.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of TestPythonParser.test_revdb_dollar_num ___________ item = <Function 'test_revdb_dollar_num'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_124.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_124.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_124.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_124.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_124.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_124.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_124.c:143: E /tmp/pytest/usession-main-1193/platcheck_124.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_124.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_124.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_124.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_124.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_124.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_124.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_124.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_124.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_124.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_124.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of TestPythonParser.test_error_forgotten_chars _________ item = <Function 'test_error_forgotten_chars'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_125.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_125.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_125.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_125.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_125.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_125.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_125.c:143: E /tmp/pytest/usession-main-1193/platcheck_125.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_125.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_125.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_125.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_125.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_125.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_125.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_125.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_125.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_125.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_125.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of TestPythonParserRevDB.test_with_and_as ___________ item = <Function 'test_with_and_as'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_126.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_126.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_126.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_126.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_126.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_126.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_126.c:143: E /tmp/pytest/usession-main-1193/platcheck_126.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_126.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_126.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_126.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_126.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_126.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_126.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_126.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_126.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_126.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_126.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of TestPythonParserRevDB.test_dont_imply_dedent ________ item = <Function 'test_dont_imply_dedent'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_127.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_127.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_127.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_127.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_127.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_127.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_127.c:143: E /tmp/pytest/usession-main-1193/platcheck_127.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_127.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_127.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_127.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_127.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_127.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_127.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_127.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_127.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_127.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_127.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of TestPythonParserRevDB.test_clear_state ___________ item = <Function 'test_clear_state'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_128.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_128.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_128.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_128.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_128.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_128.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_128.c:143: E /tmp/pytest/usession-main-1193/platcheck_128.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_128.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_128.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_128.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_128.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_128.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_128.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_128.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_128.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_128.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_128.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of TestPythonParserRevDB.test_encoding _____________ item = <Function 'test_encoding'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_129.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_129.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_129.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_129.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_129.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_129.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_129.c:143: E /tmp/pytest/usession-main-1193/platcheck_129.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_129.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_129.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_129.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_129.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_129.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_129.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_129.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_129.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_129.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_129.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of TestPythonParserRevDB.test_non_unicode_codec ________ item = <Function 'test_non_unicode_codec'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_130.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_130.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_130.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_130.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_130.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_130.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_130.c:143: E /tmp/pytest/usession-main-1193/platcheck_130.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_130.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_130.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_130.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_130.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_130.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_130.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_130.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_130.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_130.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_130.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParserRevDB.test_syntax_error ___________ item = <Function 'test_syntax_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_131.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_131.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_131.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_131.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_131.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_131.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_131.c:143: E /tmp/pytest/usession-main-1193/platcheck_131.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_131.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_131.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_131.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_131.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_131.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_131.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_131.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_131.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_131.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_131.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestPythonParserRevDB.test_is ________________ item = <Function 'test_is'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_132.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_132.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_132.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_132.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_132.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_132.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_132.c:143: E /tmp/pytest/usession-main-1193/platcheck_132.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_132.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_132.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_132.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_132.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_132.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_132.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_132.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_132.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_132.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_132.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of TestPythonParserRevDB.test_indentation_error ________ item = <Function 'test_indentation_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_133.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_133.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_133.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_133.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_133.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_133.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_133.c:143: E /tmp/pytest/usession-main-1193/platcheck_133.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_133.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_133.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_133.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_133.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_133.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_133.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_133.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_133.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_133.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_133.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of TestPythonParserRevDB.test_mac_newline ___________ item = <Function 'test_mac_newline'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_134.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_134.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_134.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_134.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_134.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_134.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_134.c:143: E /tmp/pytest/usession-main-1193/platcheck_134.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_134.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_134.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_134.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_134.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_134.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_134.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_134.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_134.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_134.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_134.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of TestPythonParserRevDB.test_mode _______________ item = <Function 'test_mode'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_135.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_135.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_135.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_135.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_135.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_135.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_135.c:143: E /tmp/pytest/usession-main-1193/platcheck_135.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_135.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_135.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_135.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_135.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_135.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_135.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_135.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_135.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_135.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_135.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of TestPythonParserRevDB.test_multiline_string _________ item = <Function 'test_multiline_string'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_136.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_136.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_136.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_136.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_136.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_136.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_136.c:143: E /tmp/pytest/usession-main-1193/platcheck_136.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_136.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_136.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_136.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_136.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_136.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_136.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_136.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_136.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_136.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_136.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of TestPythonParserRevDB.test_bytes_literal __________ item = <Function 'test_bytes_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_137.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_137.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_137.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_137.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_137.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_137.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_137.c:143: E /tmp/pytest/usession-main-1193/platcheck_137.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_137.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_137.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_137.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_137.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_137.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_137.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_137.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_137.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_137.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_137.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of TestPythonParserRevDB.test_new_octal_literal ________ item = <Function 'test_new_octal_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_138.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_138.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_138.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_138.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_138.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_138.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_138.c:143: E /tmp/pytest/usession-main-1193/platcheck_138.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_138.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_138.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_138.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_138.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_138.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_138.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_138.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_138.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_138.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_138.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______ ERROR at setup of TestPythonParserRevDB.test_new_binary_literal ________ item = <Function 'test_new_binary_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_139.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_139.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_139.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_139.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_139.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_139.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_139.c:143: E /tmp/pytest/usession-main-1193/platcheck_139.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_139.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_139.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_139.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_139.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_139.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_139.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_139.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_139.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_139.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_139.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________ ERROR at setup of TestPythonParserRevDB.test_print_function __________ item = <Function 'test_print_function'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_140.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_140.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_140.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_140.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_140.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_140.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_140.c:143: E /tmp/pytest/usession-main-1193/platcheck_140.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_140.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_140.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_140.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_140.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_140.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_140.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_140.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_140.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_140.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_140.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______ ERROR at setup of TestPythonParserRevDB.test_universal_newlines ________ item = <Function 'test_universal_newlines'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_141.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_141.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_141.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_141.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_141.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_141.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_141.c:143: E /tmp/pytest/usession-main-1193/platcheck_141.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_141.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_141.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_141.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_141.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_141.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_141.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_141.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_141.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_141.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_141.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______ ERROR at setup of TestPythonParserRevDB.test_error_forgotten_chars ______ item = <Function 'test_error_forgotten_chars'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_142.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_142.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_142.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_142.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_142.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_142.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_142.c:143: E /tmp/pytest/usession-main-1193/platcheck_142.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_142.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_142.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_142.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_142.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_142.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_142.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_142.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_142.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_142.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_142.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of TestPythonParserRevDB.test_revdb_dollar_num _________ item = <Function 'test_revdb_dollar_num'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:625: in make_builtins self.exceptions_module = Module(self, w_name) interpreter/mixedmodule.py:23: in __init__ Module.__init__(self, space, w_name) interpreter/module.py:24: in __init__ space.setitem(w_dict, space.new_interned_str('__name__'), w_name) interpreter/baseobjspace.py:890: in new_interned_str if self._side_effects_ok(): interpreter/baseobjspace.py:920: in _side_effects_ok return self._revdb_standard_code() interpreter/baseobjspace.py:901: in _revdb_standard_code from pypy.interpreter.reverse_debugging import dbstate interpreter/reverse_debugging.py:9: in <module> from pypy.module.marshal import interp_marshal module/marshal/interp_marshal.py:5: in <module> from pypy.module._file.interp_file import W_File module/_file/interp_file.py:5: in <module> from rpython.rlib import streamio ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_143.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_143.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_143.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_143.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_143.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_143.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_143.c:143: E /tmp/pytest/usession-main-1193/platcheck_143.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_143.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_143.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_143.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_143.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_143.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_143.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_143.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_143.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_143.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_143.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of TestTokenizer.test_simple __________________ item = <Function 'test_simple'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_144.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_144.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_144.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_144.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_144.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_144.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_144.c:143: E /tmp/pytest/usession-main-1193/platcheck_144.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_144.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_144.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_144.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_144.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_144.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_144.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_144.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_144.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_144.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_144.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of TestTokenizer.test_error_parenthesis ____________ item = <Function 'test_error_parenthesis'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_145.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_145.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_145.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_145.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_145.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_145.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_145.c:143: E /tmp/pytest/usession-main-1193/platcheck_145.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_145.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_145.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_145.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_145.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_145.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_145.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_145.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_145.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_145.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_145.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of TestTokenizer.test_unknown_char _______________ item = <Function 'test_unknown_char'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_146.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_146.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_146.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_146.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_146.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_146.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_146.c:143: E /tmp/pytest/usession-main-1193/platcheck_146.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_146.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_146.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_146.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_146.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_146.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_146.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_146.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_146.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_146.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_146.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of TestTokenizer.test_eol_string ________________ item = <Function 'test_eol_string'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_147.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_147.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_147.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_147.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_147.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_147.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_147.c:143: E /tmp/pytest/usession-main-1193/platcheck_147.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_147.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_147.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_147.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_147.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_147.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_147.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_147.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_147.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_147.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_147.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of TestTokenizer.test_eof_triple_quoted ____________ item = <Function 'test_eof_triple_quoted'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:25: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:35: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:467: in __init__ self.initialize() objspace/std/objspace.py:112: in initialize self.make_builtins() interpreter/baseobjspace.py:630: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:48: in __init__ from pypy.module.imp import interp_imp module/imp/interp_imp.py:1: in <module> from pypy.module.imp import importing module/imp/importing.py:14: in <module> from pypy.interpreter.streamutil import wrap_streamerror interpreter/streamutil.py:1: in <module> from rpython.rlib.streamio import StreamError ../rpython/rlib/streamio.py:40: in <module> from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/_rsocket_rffi.py:1222: in <module> cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rtyper/tool/rffi_platform.py:216: in configure for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:241: in configure_entries writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:745: in run_example_code output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/tool/gcc_cache.py:28: in build_executable_cache result = platform.execute(platform.compile(c_files, eci)) ../rpython/translator/platform/__init__.py:57: in compile ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:79: in _compile_o_files ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/posix.py:44: in _compile_c_file cwd=str(cfile.dirpath())) ../rpython/translator/platform/__init__.py:143: in _execute_c_compiler self._handle_error(returncode, stdout, stderr, outname) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1193/platcheck_148.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1193/platcheck_148.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1193/platcheck_148.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1193/platcheck_148.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_148.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1193/platcheck_148.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1193/platcheck_148.c:143: E /tmp/pytest/usession-main-1193/platcheck_148.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_148.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1193/platcheck_148.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1193/platcheck_148.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_148.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_148.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_148.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1193/platcheck_148.c:143:\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_148.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_148.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1193/platcheck_148.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ===================== 42 passed, 77 error in 61.91 seconds ===================== ++ 21:14:29 starting module/__pypy__/test [6 started in total] __ module/__pypy__/test [3 done in total, somefailed=True] ____________________ ============================= test session starts ============================== platform linux2 -- Python 2.7.18, pytest-2.9.2, py-1.4.29, pluggy-0.3.1 hypothesis profile 'default' -> deadline=None, database=DirectoryBasedExampleDatabase('/build_dir/own-linux-aarch64/build/pypy/.hypothesis/examples') pytest-2.9.2 from /build_dir/own-linux-aarch64/build/pytest.pyc rootdir: /build_dir/own-linux-aarch64/build, inifile: pytest.ini plugins: hypothesis-4.39.3 collected 68 items module/__pypy__/test/test_builders.py EEEEE module/__pypy__/test/test_bytebuffer.py EE module/__pypy__/test/test_debug.py EEEEEEE module/__pypy__/test/test_identitydict.py EEEEEE module/__pypy__/test/test_intop.py EEEEEEEEEEE module/__pypy__/test/test_locals2fast.py EEEEE module/__pypy__/test/test_magic.py EEEEEEE module/__pypy__/test/test_newmemoryview.py EEE module/__pypy__/test/test_os.py E module/__pypy__/test/test_signal.py EEEEE module/__pypy__/test/test_special.py EEEEEEEEEEEEE module/__pypy__/test/test_time.py EEE ==================================== ERRORS ==================================== ________________ ERROR at setup of AppTestBuilders.test_simple _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_80.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc109166d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_simple'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_simple'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_simple'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_simple'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_simple'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_simple'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_simple'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc10923780> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_simple'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc10923b90> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc10923b90> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_simple'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_simple'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_simple'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc106995d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc106995d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc106995d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc106995d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fc8cdd0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fc19520> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fc34c90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fc34290>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fc3f390>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_80.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_80.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_80.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_80.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_80.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_80.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_80.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_80.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_80.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_80.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_80.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_80.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_80.c:143: E /tmp/pytest/usession-main-1197/platcheck_80.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_80.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_80.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_80.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_80.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_80.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_80.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_80.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_80.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_80.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_80.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of AppTestBuilders.test_preallocate ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_81.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fb6cd50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_preallocate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_preallocate'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_preallocate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_preallocate'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_preallocate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_preallocate'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_preallocate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fb72c30> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...reallocate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb72cd0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb72cd0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...reallocate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_preallocate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_preallocate'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0fb73910> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb73910> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb73910> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fb73910> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fa778d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f1dcd00> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f3fc910>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f3f7f90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f509190>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_81.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_81.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_81.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_81.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_81.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_81.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_81.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_81.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_81.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_81.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_81.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_81.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_81.c:143: E /tmp/pytest/usession-main-1197/platcheck_81.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_81.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_81.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_81.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_81.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_81.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_81.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_81.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_81.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_81.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_81.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of AppTestBuilders.test_append_slice ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_82.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f98b950>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_append_slice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_append_slice'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_append_slice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_append_slice'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_append_slice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_append_slice'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_append_slice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0efc9690> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...pend_slice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0efc9640> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0efc9640> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...pend_slice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_append_slice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_append_slice'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f732d90> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f732d90> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f732d90> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f732d90> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fc7a0d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f19f7c0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f0952d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f09b890>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f09a9d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_82.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_82.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_82.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_82.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_82.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_82.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_82.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_82.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_82.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_82.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_82.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_82.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_82.c:143: E /tmp/pytest/usession-main-1197/platcheck_82.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_82.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_82.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_82.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_82.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_82.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_82.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_82.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_82.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_82.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_82.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of AppTestBuilders.test_stringbuilder _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_83.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ef32a50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_stringbuilder'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_stringbuilder'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_stringbuilder'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_stringbuilder'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_stringbuilder'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_stringbuilder'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_stringbuilder'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fc91be0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ingbuilder'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fca84b0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fca84b0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ingbuilder'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_stringbuilder'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_stringbuilder'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f829950> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f829950> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f829950> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f829950> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f1ece50> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f1d71a0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f3c2e50>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f3c2450>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f3fc550>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_83.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_83.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_83.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_83.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_83.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_83.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_83.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_83.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_83.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_83.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_83.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_83.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_83.c:143: E /tmp/pytest/usession-main-1197/platcheck_83.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_83.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_83.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_83.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_83.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_83.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_83.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_83.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_83.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_83.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_83.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTestBuilders.test_encode _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_84.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f7368d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_encode'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_encode'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_encode'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_encode'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_encode'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_encode'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_encode'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f9125f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_encode'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f9127d0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f9127d0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_encode'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_encode'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_encode'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc106be0d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc106be0d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc106be0d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc106be0d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f732e90> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fcc6ad0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f582550>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f975c50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f287bd0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_84.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_84.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_84.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_84.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_84.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_84.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_84.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_84.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_84.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_84.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_84.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_84.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_84.c:143: E /tmp/pytest/usession-main-1197/platcheck_84.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_84.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_84.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_84.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_84.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_84.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_84.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_84.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_84.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_84.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_84.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of AppTest.test_bytebuffer ___________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_85.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc10916750>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bytebuffer'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bytebuffer'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bytebuffer'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bytebuffer'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bytebuffer'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bytebuffer'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bytebuffer'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fc4b730> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...bytebuffer'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fc4baa0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fc4baa0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...bytebuffer'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bytebuffer'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_bytebuffer'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f9ded50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f9ded50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f9ded50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f9ded50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f672090> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f16c4b0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fb59210>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f461510>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f5830d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_85.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_85.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_85.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_85.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_85.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_85.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_85.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_85.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_85.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_85.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_85.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_85.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_85.c:143: E /tmp/pytest/usession-main-1197/platcheck_85.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_85.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_85.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_85.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_85.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_85.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_85.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_85.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_85.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_85.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_85.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of AppTest.test_buffer_getslice_empty _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_86.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fa519d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_buffer_getslice_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_buffer_getslice_empty'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_buffer_getslice_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_buffer_getslice_empty'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_buffer_getslice_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_buffer_getslice_empty'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_buffer_getslice_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fb72f00> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...lice_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb72640> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb72640> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...lice_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_buffer_getslice_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_buffer_getslice_empty'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f372cd0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f372cd0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f372cd0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f372cd0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f18dd50> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fc7cde0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f343ad0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fbd0c10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f086bd0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_86.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_86.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_86.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_86.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_86.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_86.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_86.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_86.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_86.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_86.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_86.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_86.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_86.c:143: E /tmp/pytest/usession-main-1197/platcheck_86.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_86.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_86.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_86.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_86.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_86.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_86.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_86.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_86.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_86.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_86.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestDebug.test_debug_print ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_87.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fd2b9d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_print'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_print'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_print'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ef6db40> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ebug_print'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ef6d3c0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ef6d3c0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ebug_print'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_debug_print'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f3f1c10> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f3f1c10> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f3f1c10> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f3f1c10> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f6f2250> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f1e3830> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef11bd0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f3e1d50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f5830d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_87.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_87.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_87.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_87.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_87.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_87.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_87.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_87.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_87.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_87.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_87.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_87.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_87.c:143: E /tmp/pytest/usession-main-1197/platcheck_87.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_87.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_87.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_87.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_87.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_87.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_87.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_87.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_87.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_87.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_87.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of AppTestDebug.test_debug_print_once _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_88.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f1f3950>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print_once'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_print_once'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print_once'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_print_once'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print_once'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_print_once'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print_once'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ef9be60> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...print_once'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ef9b320> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ef9b320> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...print_once'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_print_once'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_debug_print_once'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f1db0d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f1db0d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f1db0d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f1db0d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f85bc50> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f2b81a0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f582910>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f582b10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fc0c3d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_88.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_88.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_88.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_88.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_88.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_88.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_88.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_88.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_88.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_88.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_88.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_88.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_88.c:143: E /tmp/pytest/usession-main-1197/platcheck_88.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_88.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_88.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_88.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_88.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_88.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_88.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_88.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_88.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_88.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_88.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestDebug.test_debug_flush ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_89.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f3f9bd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_flush'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_flush'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_flush'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_flush'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_flush'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_flush'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_flush'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ed62870> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ebug_flush'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ed62320> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ed62320> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ebug_flush'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_flush'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_debug_flush'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f31b110> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f31b110> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f31b110> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f31b110> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f2530d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f3ffbb0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f516690>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f040550>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef74810>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_89.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_89.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_89.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_89.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_89.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_89.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_89.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_89.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_89.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_89.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_89.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_89.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_89.c:143: E /tmp/pytest/usession-main-1197/platcheck_89.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_89.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_89.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_89.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_89.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_89.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_89.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_89.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_89.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_89.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_89.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of AppTestDebug.test_debug_read_timestamp ___________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_90.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f5056d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_read_timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_read_timestamp'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_read_timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_read_timestamp'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_read_timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_read_timestamp'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_read_timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f17a8c0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f17a460> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f17a460> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_read_timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_debug_read_timestamp'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f461ed0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f461ed0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f461ed0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f461ed0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f086410> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f512520> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f1ec750>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ef7b350>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f4ff050>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_90.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_90.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_90.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_90.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_90.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_90.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_90.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_90.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_90.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_90.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_90.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_90.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_90.c:143: E /tmp/pytest/usession-main-1197/platcheck_90.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_90.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_90.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_90.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_90.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_90.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_90.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_90.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_90.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_90.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_90.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________ ERROR at setup of AppTestDebug.test_debug_get_timestamp_unit _________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_91.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f089750>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_get_timestamp_unit'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_get_timestamp_unit'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_get_timestamp_unit'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_get_timestamp_unit'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_get_timestamp_unit'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_get_timestamp_unit'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_get_timestamp_unit'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f5a11e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...stamp_unit'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f5a1640> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f5a1640> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...stamp_unit'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_get_timestamp_unit'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_debug_get_timestamp_unit'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f33d550> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f33d550> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f33d550> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f33d550> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f30fb10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fc39e50> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fc24910>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fc6ee10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f2fdc10>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_91.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_91.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_91.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_91.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_91.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_91.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_91.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_91.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_91.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_91.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_91.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_91.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_91.c:143: E /tmp/pytest/usession-main-1197/platcheck_91.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_91.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_91.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_91.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_91.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_91.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_91.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_91.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_91.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_91.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_91.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of AppTestDebug.test_debug_start_stop_timestamp ________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_92.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f0977d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_start_stop_timestamp'>, '...lticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_start_stop_timestamp'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_start_stop_timestamp'>, '...lticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_start_stop_timestamp'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_start_stop_timestamp'>, '...lticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_debug_start_stop_timestamp'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_start_stop_timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f32deb0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f32d690> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f32d690> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_debug_start_stop_timestamp'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_debug_start_stop_timestamp'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f461590> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f461590> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f461590> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f461590> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f5828d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f0987c0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef2b610>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f5d86d0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f361390>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_92.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_92.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_92.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_92.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_92.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_92.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_92.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_92.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_92.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_92.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_92.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_92.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_92.c:143: E /tmp/pytest/usession-main-1197/platcheck_92.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_92.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_92.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_92.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_92.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_92.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_92.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_92.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_92.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_92.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_92.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of AppTestDebug.test_remote_exec_exists ____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_93.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f089950>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_remote_exec_exists'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_remote_exec_exists'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_remote_exec_exists'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_remote_exec_exists'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_remote_exec_exists'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_remote_exec_exists'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_remote_exec_exists'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f9f0be0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...xec_exists'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f9f0d20> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f9f0d20> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...xec_exists'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_remote_exec_exists'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_remote_exec_exists'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc106fd650> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc106fd650> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc106fd650> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc106fd650> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fc345d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ecb6520> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f5ec510>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f9de890>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fbd0110>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_93.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_93.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_93.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_93.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_93.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_93.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_93.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_93.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_93.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_93.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_93.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_93.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_93.c:143: E /tmp/pytest/usession-main-1197/platcheck_93.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_93.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_93.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_93.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_93.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_93.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_93.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_93.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_93.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_93.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_93.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of AppTestIdentityDict.test_numbers ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_94.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f3e65d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_numbers'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_numbers'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_numbers'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_numbers'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_numbers'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_numbers'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_numbers'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ed4f0a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_numbers'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ed4f370> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ed4f370> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_numbers'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_numbers'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_numbers'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f349210> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f349210> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f349210> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f349210> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f82c950> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fbc0bb0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f60d3d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f58d090>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef80390>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_94.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_94.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_94.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_94.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_94.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_94.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_94.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_94.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_94.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_94.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_94.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_94.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_94.c:143: E /tmp/pytest/usession-main-1197/platcheck_94.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_94.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_94.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_94.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_94.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_94.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_94.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_94.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_94.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_94.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_94.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTestIdentityDict.test_get ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_95.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fbcddd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f0e4af0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i... 'test_get'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f0e48c0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f0e48c0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i... 'test_get'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_get'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f361650> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f361650> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f361650> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f361650> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fa7a950> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fa61a60> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f461610>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f1a1dd0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f582350>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_95.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_95.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_95.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_95.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_95.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_95.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_95.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_95.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_95.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_95.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_95.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_95.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_95.c:143: E /tmp/pytest/usession-main-1197/platcheck_95.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_95.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_95.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_95.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_95.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_95.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_95.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_95.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_95.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_95.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_95.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of AppTestIdentityDict.test_unhashable _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_96.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ee1ddd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_unhashable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_unhashable'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_unhashable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_unhashable'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_unhashable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_unhashable'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_unhashable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f43c5a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...unhashable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f43cc80> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f43cc80> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...unhashable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_unhashable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_unhashable'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0ecb00d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ecb00d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ecb00d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0ecb00d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f82cf10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fb45bb0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f702790>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ed18950>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef48210>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_96.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_96.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_96.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_96.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_96.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_96.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_96.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_96.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_96.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_96.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_96.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_96.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_96.c:143: E /tmp/pytest/usession-main-1197/platcheck_96.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_96.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_96.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_96.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_96.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_96.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_96.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_96.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_96.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_96.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_96.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestIdentityDict.test_keys ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_97.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fb56ed0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_keys'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_keys'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_keys'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_keys'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_keys'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_keys'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_keys'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fb86690> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...'test_keys'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb865f0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb865f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...'test_keys'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_keys'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_keys'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f38fb50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f38fb50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f38fb50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f38fb50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f6aec50> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f420590> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ecab2d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f8bd190>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f9fca90>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_97.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_97.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_97.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_97.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_97.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_97.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_97.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_97.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_97.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_97.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_97.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_97.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_97.c:143: E /tmp/pytest/usession-main-1197/platcheck_97.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_97.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_97.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_97.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_97.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_97.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_97.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_97.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_97.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_97.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_97.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTestIdentityDict.test_in _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_98.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fa45f50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_in'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_in'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_in'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_in'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_in'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_in'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_in'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f912a00> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...d 'test_in'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f912500> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f912500> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...d 'test_in'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_in'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_in'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0ef2ba90> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef2ba90> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef2ba90> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0ef2ba90> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fc0dbd0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f8fcec0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f337a10>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fc22890>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f324990>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_98.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_98.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_98.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_98.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_98.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_98.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_98.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_98.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_98.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_98.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_98.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_98.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_98.c:143: E /tmp/pytest/usession-main-1197/platcheck_98.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_98.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_98.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_98.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_98.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_98.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_98.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_98.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_98.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_98.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_98.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of AppTestIdentityDict.test_iterate ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_99.c: In function...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f7a0050>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_iterate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_iterate'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_iterate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_iterate'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_iterate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_iterate'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_iterate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f9f4a00> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_iterate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f9f45a0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f9f45a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_iterate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_iterate'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_iterate'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0edc8350> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0edc8350> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0edc8350> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0edc8350> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fc33390> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fb16830> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef74810>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f30fc10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f6850d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_99.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_99.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_99.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_99.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_99.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_99.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_99.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/use...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_99.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_99.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_99.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_99.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_99.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_99.c:143: E /tmp/pytest/usession-main-1197/platcheck_99.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_99.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_99.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_99.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_99.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_99.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_99.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_99.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_99.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_99.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_99.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestIntOp.test_intmask __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_100.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f2e4ad0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_intmask'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_intmask'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_intmask'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_intmask'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_intmask'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_intmask'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_intmask'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f835280> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_intmask'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f835c80> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f835c80> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_intmask'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_intmask'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_intmask'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0fb03e90> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb03e90> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb03e90> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fb03e90> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fbd0290> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fb46360> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f8bd250>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f8bded0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ecab390>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_100.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_100.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_100.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_100.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_100.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_100.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_100.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_100.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_100.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_100.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_100.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_100.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_100.c:143: E /tmp/pytest/usession-main-1197/platcheck_100.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_100.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_100.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_100.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_100.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_100.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_100.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_100.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_100.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_100.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_100.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestIntOp.test_int_add __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_101.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fb7ff50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_add'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_add'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_add'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_add'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_add'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_add'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_add'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f1144b0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_add'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f1140a0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f1140a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_add'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_add'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_int_add'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f23bfd0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f23bfd0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f23bfd0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f23bfd0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f229510> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f723d00> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f9eead0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fc07e50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fd39e50>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_101.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_101.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_101.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_101.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_101.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_101.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_101.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_101.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_101.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_101.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_101.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_101.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_101.c:143: E /tmp/pytest/usession-main-1197/platcheck_101.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_101.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_101.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_101.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_101.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_101.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_101.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_101.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_101.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_101.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_101.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestIntOp.test_int_sub __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_102.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f707cd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_sub'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_sub'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_sub'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_sub'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_sub'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_sub'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_sub'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ec966e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_sub'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec960f0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec960f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_sub'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_sub'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_int_sub'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f6f2150> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f6f2150> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f6f2150> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f6f2150> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f6d4290> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f1246e0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f82cc50>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fadce90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0edc8450>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_102.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_102.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_102.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_102.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_102.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_102.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_102.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_102.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_102.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_102.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_102.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_102.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_102.c:143: E /tmp/pytest/usession-main-1197/platcheck_102.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_102.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_102.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_102.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_102.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_102.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_102.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_102.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_102.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_102.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_102.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestIntOp.test_int_mul __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_103.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f713f50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mul'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_mul'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mul'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_mul'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mul'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_mul'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mul'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fb07fa0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_mul'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb07140> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb07140> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_mul'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mul'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_int_mul'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f732d50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f732d50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f732d50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f732d50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f9a52d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f2ed280> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ee8d690>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ee8ddd0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fb59250>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_103.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_103.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_103.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_103.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_103.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_103.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_103.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_103.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_103.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_103.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_103.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_103.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_103.c:143: E /tmp/pytest/usession-main-1197/platcheck_103.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_103.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_103.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_103.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_103.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_103.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_103.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_103.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_103.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_103.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_103.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestIntOp.test_int_floordiv _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_104.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fb479d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_floordiv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_floordiv'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_floordiv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_floordiv'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_floordiv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_floordiv'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_floordiv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0efb1e10> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_floordiv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0efb16e0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0efb16e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_floordiv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_floordiv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_int_floordiv'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f7737d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f7737d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f7737d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f7737d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f031e90> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f9949f0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fb3d590>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f30c410>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f264490>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_104.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_104.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_104.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_104.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_104.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_104.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_104.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_104.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_104.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_104.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_104.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_104.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_104.c:143: E /tmp/pytest/usession-main-1197/platcheck_104.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_104.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_104.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_104.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_104.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_104.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_104.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_104.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_104.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_104.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_104.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestIntOp.test_int_mod __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_105.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f986d50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_mod'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_mod'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_mod'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ec845f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_mod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec84500> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec84500> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_int_mod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_mod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_int_mod'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f582fd0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f582fd0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f582fd0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f582fd0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ede0bd0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f5f43d0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f8b5ad0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f319290>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f8b9310>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_105.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_105.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_105.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_105.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_105.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_105.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_105.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_105.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_105.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_105.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_105.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_105.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_105.c:143: E /tmp/pytest/usession-main-1197/platcheck_105.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_105.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_105.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_105.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_105.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_105.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_105.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_105.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_105.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_105.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_105.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTestIntOp.test_int_lshift ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_106.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f6c4a50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_lshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_lshift'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_lshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_lshift'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_lshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_lshift'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_lshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ebc4280> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...int_lshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ebc40f0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ebc40f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...int_lshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_lshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_int_lshift'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f349e90> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f349e90> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f349e90> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f349e90> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fa8d110> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f6c0d70> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ee24e10>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ee24890>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f1a13d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_106.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_106.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_106.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_106.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_106.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_106.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_106.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_106.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_106.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_106.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_106.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_106.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_106.c:143: E /tmp/pytest/usession-main-1197/platcheck_106.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_106.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_106.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_106.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_106.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_106.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_106.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_106.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_106.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_106.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_106.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTestIntOp.test_int_rshift ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_107.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f312a50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_rshift'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_rshift'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_int_rshift'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0eaa60a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0eaa6730> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0eaa6730> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_int_rshift'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f9ee6d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f9ee6d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f9ee6d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f9ee6d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ecb02d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f318750> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f732cd0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0efe0e10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f37e110>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_107.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_107.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_107.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_107.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_107.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_107.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_107.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_107.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_107.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_107.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_107.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_107.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_107.c:143: E /tmp/pytest/usession-main-1197/platcheck_107.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_107.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_107.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_107.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_107.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_107.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_107.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_107.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_107.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_107.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_107.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestIntOp.test_uint_rshift ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_108.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ef18150>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_uint_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_uint_rshift'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_uint_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_uint_rshift'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_uint_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_uint_rshift'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_uint_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f9097d0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f909500> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f909500> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...int_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_uint_rshift'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_uint_rshift'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f797610> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f797610> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f797610> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f797610> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0eb07390> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f143130> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f4e7cd0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f0c5690>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f03be90>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_108.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_108.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_108.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_108.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_108.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_108.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_108.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_108.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_108.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_108.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_108.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_108.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_108.c:143: E /tmp/pytest/usession-main-1197/platcheck_108.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_108.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_108.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_108.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_108.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_108.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_108.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_108.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_108.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_108.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_108.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of AppTestIntOp.test_mulmod __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_109.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f586150>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_mulmod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_mulmod'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_mulmod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_mulmod'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_mulmod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_mulmod'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_mulmod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f25bfa0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_mulmod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f25bf50> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f25bf50> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_mulmod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_mulmod'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_mulmod'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f128950> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f128950> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f128950> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f128950> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f90fe50> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f32b050> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0eb74f90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fae9b10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f685050>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_109.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_109.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_109.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_109.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_109.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_109.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_109.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_109.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_109.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_109.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_109.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_109.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_109.c:143: E /tmp/pytest/usession-main-1197/platcheck_109.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_109.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_109.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_109.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_109.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_109.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_109.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_109.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_109.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_109.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_109.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestIntOp.test_invalid __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_110.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ef18ad0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_invalid'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_invalid'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_invalid'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_invalid'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_invalid'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_invalid'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_invalid'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f92d410> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_invalid'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f92dcd0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f92dcd0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_invalid'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_invalid'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_invalid'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f9fc810> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f9fc810> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f9fc810> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f9fc810> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ebd1d50> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f9ae4b0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef80450>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f3e1790>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fb03d90>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_110.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_110.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_110.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_110.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_110.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_110.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_110.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_110.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_110.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_110.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_110.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_110.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_110.c:143: E /tmp/pytest/usession-main-1197/platcheck_110.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_110.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_110.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_110.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_110.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_110.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_110.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_110.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_110.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_110.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_110.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____ ERROR at setup of AppTestLocals2Fast.test_set_locals_using_save_locals ____ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_111.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ef9a050>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_locals_using_save_locals'>,...icall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_locals_using_save_locals'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_locals_using_save_locals'>,...icall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_locals_using_save_locals'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_locals_using_save_locals'>,...icall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_locals_using_save_locals'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_locals_using_save_locals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f18c9b0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ave_locals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ebf9550> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ebf9550> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ave_locals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_locals_using_save_locals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_set_locals_using_save_locals'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True} config = <rpython.config.config.Config object at 0xfffc0fa98c50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fa98c50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fa98c50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fa98c50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f5da410> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ef874b0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f4aec50>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f4ae0d0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ed76d10>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_111.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_111.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_111.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_111.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_111.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_111.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_111.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_111.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_111.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_111.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_111.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_111.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_111.c:143: E /tmp/pytest/usession-main-1197/platcheck_111.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_111.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_111.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_111.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_111.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_111.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_111.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_111.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_111.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_111.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_111.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of AppTestLocals2Fast.test_frame_simple_change _________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_112.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ec9acd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_simple_change'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_simple_change'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_simple_change'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_simple_change'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_simple_change'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_simple_change'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_simple_change'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f7ac960> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ple_change'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f7acbe0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f7acbe0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ple_change'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_simple_change'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_frame_simple_change'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True} config = <rpython.config.config.Config object at 0xfffc0ec9b150> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ec9b150> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ec9b150> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0ec9b150> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0edc8e10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f32b0c0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ec51c90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ec51450>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0eeeb710>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_112.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_112.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_112.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_112.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_112.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_112.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_112.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_112.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_112.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_112.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_112.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_112.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_112.c:143: E /tmp/pytest/usession-main-1197/platcheck_112.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_112.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_112.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_112.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_112.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_112.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_112.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_112.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_112.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_112.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_112.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________ ERROR at setup of AppTestLocals2Fast.test_frame_co_freevars __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_113.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f8be1d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_freevars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_co_freevars'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_freevars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_co_freevars'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_freevars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_co_freevars'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_freevars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f857190> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...o_freevars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f8577d0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f8577d0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...o_freevars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_freevars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_frame_co_freevars'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True} config = <rpython.config.config.Config object at 0xfffc0fbd0590> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fbd0590> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fbd0590> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fbd0590> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f0c5d10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f612ec0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0faadad0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f440950>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ee7bdd0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_113.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_113.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_113.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_113.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_113.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_113.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_113.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_113.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_113.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_113.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_113.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_113.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_113.c:143: E /tmp/pytest/usession-main-1197/platcheck_113.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_113.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_113.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_113.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_113.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_113.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_113.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_113.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_113.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_113.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_113.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________ ERROR at setup of AppTestLocals2Fast.test_frame_co_cellvars __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_114.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f376d50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_cellvars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_co_cellvars'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_cellvars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_co_cellvars'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_cellvars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_co_cellvars'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_cellvars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f4eaa50> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...o_cellvars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f4ea410> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f4ea410> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...o_cellvars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_co_cellvars'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_frame_co_cellvars'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True} config = <rpython.config.config.Config object at 0xfffc0f57ff50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f57ff50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f57ff50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f57ff50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f38f2d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f55a7c0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ed646d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f7641d0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f48cf10>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_114.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_114.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_114.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_114.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_114.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_114.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_114.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_114.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_114.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_114.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_114.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_114.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_114.c:143: E /tmp/pytest/usession-main-1197/platcheck_114.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_114.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_114.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_114.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_114.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_114.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_114.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_114.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_114.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_114.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_114.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____ ERROR at setup of AppTestLocals2Fast.test_frame_change_in_inner_frame _____ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_115.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ee8b1d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_change_in_inner_frame'>, ...ticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_change_in_inner_frame'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_change_in_inner_frame'>, ...ticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_change_in_inner_frame'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_change_in_inner_frame'>, ...ticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_frame_change_in_inner_frame'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_change_in_inner_frame'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fb901e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...nner_frame'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb90f50> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb90f50> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...nner_frame'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_frame_change_in_inner_frame'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_frame_change_in_inner_frame'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True} config = <rpython.config.config.Config object at 0xfffc0f4f4690> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f4f4690> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f4f4690> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f4f4690> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f6856d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ecb1130> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f54ae90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0faffa50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fb1b910>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_115.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_115.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_115.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_115.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_115.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_115.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_115.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_115.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_115.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_115.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_115.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_115.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_115.c:143: E /tmp/pytest/usession-main-1197/platcheck_115.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_115.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_115.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_115.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_115.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_115.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_115.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_115.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_115.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_115.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_115.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __ ERROR at setup of AppTestMagic.test_save_module_content_for_future_reload ___ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_116.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ef9ac50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_save_module_content_for_future_... <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_save_module_content_for_future_reload'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_save_module_content_for_future_... <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_save_module_content_for_future_reload'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_save_module_content_for_future_... <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_save_module_content_for_future_reload'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_save_module_content_for_future_reload'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ea4b3c0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ure_reload'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ea4b5f0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ea4b5f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ure_reload'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_save_module_content_for_future_reload'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_save_module_content_for_future_reload'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f8e10d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f8e10d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f8e10d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f8e10d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ee8e750> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0efb4ad0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0eb073d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ef83c90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f0c5ed0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_116.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_116.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_116.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_116.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_116.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_116.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_116.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_116.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_116.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_116.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_116.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_116.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_116.c:143: E /tmp/pytest/usession-main-1197/platcheck_116.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_116.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_116.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_116.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_116.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_116.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_116.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_116.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_116.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_116.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_116.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of AppTestMagic.test_new_code_hook _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_117.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f8c71d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_new_code_hook'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_new_code_hook'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_new_code_hook'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_new_code_hook'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_new_code_hook'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_new_code_hook'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_new_code_hook'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ebae190> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._code_hook'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ebaec80> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ebaec80> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._code_hook'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_new_code_hook'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_new_code_hook'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0ebf2910> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ebf2910> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ebf2910> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0ebf2910> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f387150> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fa0f440> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fc0d690>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ea77e90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ecacb10>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_117.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_117.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_117.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_117.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_117.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_117.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_117.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_117.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_117.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_117.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_117.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_117.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_117.c:143: E /tmp/pytest/usession-main-1197/platcheck_117.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_117.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_117.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_117.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_117.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_117.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_117.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_117.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_117.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_117.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_117.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestMagic.test_decode_long ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_118.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0edefdd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_decode_long'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_decode_long'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_decode_long'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_decode_long'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_decode_long'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_decode_long'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_decode_long'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f0277d0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ecode_long'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f027320> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f027320> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ecode_long'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_decode_long'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_decode_long'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f429350> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f429350> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f429350> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f429350> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ee427d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0edd5e50> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fae9090>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f4f45d0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0eb74a10>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_118.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_118.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_118.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_118.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_118.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_118.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_118.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_118.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_118.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_118.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_118.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_118.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_118.c:143: E /tmp/pytest/usession-main-1197/platcheck_118.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_118.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_118.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_118.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_118.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_118.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_118.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_118.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_118.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_118.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_118.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestMagic.test_promote __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_119.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ede2b50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_promote'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_promote'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_promote'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_promote'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_promote'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_promote'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_promote'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f635a00> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_promote'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f6350f0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f6350f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...st_promote'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_promote'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_promote'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0fbbf250> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fbbf250> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fbbf250> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fbbf250> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ef801d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ed9e830> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f84c190>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fc7aad0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e8be290>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_119.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_119.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_119.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_119.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_119.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_119.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_119.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_119.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_119.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_119.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_119.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_119.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_119.c:143: E /tmp/pytest/usession-main-1197/platcheck_119.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_119.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_119.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_119.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_119.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_119.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_119.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_119.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_119.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_119.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_119.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestMagic.test_utf8_content _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_120.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0edbf450>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_utf8_content'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_utf8_content'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_utf8_content'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_utf8_content'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_utf8_content'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_utf8_content'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_utf8_content'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fa84c30> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...f8_content'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fa84370> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fa84370> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...f8_content'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_utf8_content'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_utf8_content'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f562790> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f562790> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f562790> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f562790> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0eb07a10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0edb01a0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f520050>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f5ecc50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef74490>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_120.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_120.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_120.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_120.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_120.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_120.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_120.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_120.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_120.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_120.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_120.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_120.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_120.c:143: E /tmp/pytest/usession-main-1197/platcheck_120.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_120.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_120.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_120.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_120.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_120.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_120.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_120.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_120.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_120.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_120.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of AppTestMagic.test_get_osfhandle _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_121.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ee3cdd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_osfhandle'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_osfhandle'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_osfhandle'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_osfhandle'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_osfhandle'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_osfhandle'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_osfhandle'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f666410> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._osfhandle'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ee45690> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ee45690> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._osfhandle'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_osfhandle'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_get_osfhandle'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f922a10> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f922a10> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f922a10> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f922a10> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fa7aa10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ee13ad0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f128610>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ee53310>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef52f50>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_121.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_121.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_121.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_121.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_121.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_121.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_121.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_121.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_121.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_121.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_121.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_121.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_121.c:143: E /tmp/pytest/usession-main-1197/platcheck_121.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_121.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_121.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_121.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_121.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_121.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_121.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_121.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_121.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_121.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_121.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of AppTestMagic.test_list_get_physical_size __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_122.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0fd1de50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_get_physical_size'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_list_get_physical_size'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_get_physical_size'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_list_get_physical_size'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_get_physical_size'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_list_get_physical_size'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_get_physical_size'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0e811460> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...sical_size'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e811870> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e811870> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...sical_size'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_get_physical_size'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_list_get_physical_size'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f18da90> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f18da90> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f18da90> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f18da90> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f4c8450> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ef95c20> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0efe0b50>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ef2a650>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fb972d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_122.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_122.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_122.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_122.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_122.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_122.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_122.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_122.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_122.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_122.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_122.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_122.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_122.c:143: E /tmp/pytest/usession-main-1197/platcheck_122.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_122.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_122.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_122.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_122.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_122.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_122.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_122.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_122.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_122.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_122.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _____________ ERROR at setup of AppTestMinimal.test_newmemoryview ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_123.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ed94ed0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_newmemoryview'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_newmemoryview'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_newmemoryview'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_newmemoryview'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_newmemoryview'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_newmemoryview'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_newmemoryview'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ec08410> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...memoryview'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec080a0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec080a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...memoryview'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_newmemoryview'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_newmemoryview'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0e9cfad0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0e9cfad0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0e9cfad0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0e9cfad0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f5dd450> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e9d3130> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f38fc90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f429290>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f30fb50>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_123.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_123.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_123.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_123.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_123.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_123.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_123.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_123.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_123.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_123.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_123.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_123.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_123.c:143: E /tmp/pytest/usession-main-1197/platcheck_123.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_123.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_123.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_123.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_123.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_123.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_123.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_123.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_123.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_123.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_123.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestMinimal.test_empty __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_124.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ee21e50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_empty'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_empty'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_empty'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f3831e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...test_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f5d5a00> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f5d5a00> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...test_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_empty'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_empty'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0e897cd0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0e897cd0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0e897cd0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0e897cd0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0e968310> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ed5ad70> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e803e90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0e803310>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ebd2c90>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_124.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_124.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_124.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_124.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_124.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_124.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_124.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_124.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_124.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_124.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_124.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_124.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_124.c:143: E /tmp/pytest/usession-main-1197/platcheck_124.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_124.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_124.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_124.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_124.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_124.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_124.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_124.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_124.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_124.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_124.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTestMinimal.test_bufferable _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_125.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ef58ad0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bufferable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bufferable'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bufferable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bufferable'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bufferable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bufferable'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bufferable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f0f6230> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...bufferable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e94e5a0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e94e5a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...bufferable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bufferable'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_bufferable'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0ef88b50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef88b50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef88b50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0ef88b50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f361c90> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fbb1050> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e82eb10>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f1265d0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e887cd0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_125.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_125.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_125.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_125.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_125.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_125.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_125.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_125.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_125.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_125.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_125.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_125.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_125.c:143: E /tmp/pytest/usession-main-1197/platcheck_125.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_125.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_125.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_125.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_125.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_125.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_125.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_125.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_125.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_125.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_125.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestOs.test_real_getenv _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_126.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ed94ad0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_real_getenv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_real_getenv'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_real_getenv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_real_getenv'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_real_getenv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_real_getenv'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_real_getenv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ef618c0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...eal_getenv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ef614b0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ef614b0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...eal_getenv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_real_getenv'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_real_getenv'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0fb6b990> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb6b990> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb6b990> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fb6b990> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f7d5c50> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f257a60> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f786590>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ef6ed50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ed07350>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_126.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_126.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_126.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_126.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_126.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_126.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_126.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_126.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_126.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_126.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_126.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_126.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_126.c:143: E /tmp/pytest/usession-main-1197/platcheck_126.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_126.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_126.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_126.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_126.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_126.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_126.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_126.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_126.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_126.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_126.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTestMinimal.test_signal _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_127.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ef5c450>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_signal'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_signal'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_signal'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_signal'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_signal'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_signal'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_signal'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ed1edc0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_signal'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ed1ecd0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ed1ecd0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_signal'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_signal'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_signal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xfffc0f29bed0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f29bed0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f29bed0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f29bed0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f34d210> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e5ef4b0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fbd05d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ee53490>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ebbd1d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_127.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_127.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_127.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_127.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_127.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_127.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_127.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_127.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_127.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_127.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_127.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_127.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_127.c:143: E /tmp/pytest/usession-main-1197/platcheck_127.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_127.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_127.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_127.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_127.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_127.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_127.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_127.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_127.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_127.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_127.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of AppTestThreadSignal.test_exit_twice _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_128.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f4d3550>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_exit_twice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_exit_twice'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_exit_twice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_exit_twice'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_exit_twice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_exit_twice'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_exit_twice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0e703190> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...exit_twice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e703870> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e703870> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...exit_twice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_exit_twice'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_exit_twice'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__', 'thread', 'signal', 'time']} config = <rpython.config.config.Config object at 0xfffc0f8bdb50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f8bdb50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f8bdb50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f8bdb50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fd07a10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e711d70> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ebe63d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f01e850>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e816650>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_128.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_128.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_128.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_128.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_128.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_128.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_128.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_128.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_128.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_128.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_128.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_128.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_128.c:143: E /tmp/pytest/usession-main-1197/platcheck_128.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_128.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_128.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_128.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_128.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_128.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_128.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_128.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_128.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_128.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_128.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________ ERROR at setup of AppTestThreadSignal.test_enable_signals ___________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_129.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0e8ab6d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_enable_signals'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_enable_signals'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_enable_signals'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f8b39b0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...le_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f8b3f50> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f8b3f50> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...le_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_enable_signals'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__', 'thread', 'signal', 'time']} config = <rpython.config.config.Config object at 0xfffc0f424050> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f424050> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f424050> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f424050> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f90f910> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ea41670> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fd39a90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0edd1f90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f384890>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_129.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_129.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_129.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_129.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_129.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_129.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_129.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_129.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_129.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_129.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_129.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_129.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_129.c:143: E /tmp/pytest/usession-main-1197/platcheck_129.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_129.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_129.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_129.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_129.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_129.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_129.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_129.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_129.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_129.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_129.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of AppTestThreadSignal.test_thread_fork_signals ________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_130.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ea7e7d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_thread_fork_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_thread_fork_signals'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_thread_fork_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_thread_fork_signals'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_thread_fork_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_thread_fork_signals'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_thread_fork_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fa99be0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...rk_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fa995f0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fa995f0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...rk_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_thread_fork_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_thread_fork_signals'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__', 'thread', 'signal', 'time']} config = <rpython.config.config.Config object at 0xfffc0f573e10> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f573e10> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f573e10> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f573e10> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f4d79d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f465f30> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fbd0510>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ef529d0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ebd4150>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_130.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_130.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_130.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_130.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_130.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_130.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_130.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_130.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_130.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_130.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_130.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_130.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_130.c:143: E /tmp/pytest/usession-main-1197/platcheck_130.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_130.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_130.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_130.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_130.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_130.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_130.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_130.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_130.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_130.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_130.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of AppTestThreadSignalLock.test_enable_signals _________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_131.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f4f06d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_enable_signals'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_enable_signals'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_enable_signals'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f8571e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...le_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f857460> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f857460> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...le_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_enable_signals'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_enable_signals'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'usemodules': ['__pypy__', 'thread', 'signal']} config = <rpython.config.config.Config object at 0xfffc0eb0b550> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0eb0b550> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0eb0b550> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0eb0b550> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f34db10> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e8728a0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0eaba850>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0eda7e50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f1db090>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_131.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_131.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_131.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_131.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_131.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_131.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_131.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_131.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_131.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_131.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_131.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_131.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_131.c:143: E /tmp/pytest/usession-main-1197/platcheck_131.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_131.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_131.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_131.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_131.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_131.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_131.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_131.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_131.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_131.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_131.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________________ ERROR at setup of AppTest.test_cpumodel ____________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_132.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f112750>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_cpumodel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_cpumodel'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_cpumodel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_cpumodel'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_cpumodel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_cpumodel'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_cpumodel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fb07fa0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_cpumodel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb07e10> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fb07e10> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_cpumodel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_cpumodel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_cpumodel'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0f5e8a50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f5e8a50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f5e8a50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f5e8a50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0effd310> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f4cf1a0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f20ed50>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ed763d0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f5534d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_132.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_132.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_132.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_132.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_132.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_132.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_132.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_132.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_132.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_132.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_132.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_132.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_132.c:143: E /tmp/pytest/usession-main-1197/platcheck_132.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_132.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_132.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_132.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_132.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_132.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_132.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_132.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_132.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_132.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_132.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ __________________ ERROR at setup of AppTest.test_builtinify ___________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_133.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f4d2d50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_builtinify'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_builtinify'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_builtinify'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_builtinify'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_builtinify'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_builtinify'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_builtinify'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ee59690> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...builtinify'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ee59870> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ee59870> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...builtinify'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_builtinify'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_builtinify'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0ef78f10> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef78f10> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef78f10> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0ef78f10> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0e5f38d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f4edad0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0eb9b990>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f7f5890>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f270f10>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_133.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_133.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_133.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_133.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_133.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_133.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_133.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_133.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_133.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_133.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_133.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_133.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_133.c:143: E /tmp/pytest/usession-main-1197/platcheck_133.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_133.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_133.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_133.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_133.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_133.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_133.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_133.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_133.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_133.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_133.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTest.test_hidden_applevel ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_134.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0e708550>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_hidden_applevel'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_hidden_applevel'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_hidden_applevel'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fbd4cd0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...n_applevel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fbd4be0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fbd4be0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...n_applevel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_hidden_applevel'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0f30f6d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f30f6d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f30f6d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f30f6d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fa8d850> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e70d3d0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ecd8910>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ecd8890>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ed35710>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_134.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_134.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_134.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_134.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_134.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_134.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_134.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_134.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_134.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_134.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_134.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_134.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_134.c:143: E /tmp/pytest/usession-main-1197/platcheck_134.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_134.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_134.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_134.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_134.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_134.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_134.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_134.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_134.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_134.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_134.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ____________ ERROR at setup of AppTest.test_hidden_applevel_frames _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_135.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0e737a50>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel_frames'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_hidden_applevel_frames'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel_frames'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_hidden_applevel_frames'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel_frames'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_hidden_applevel_frames'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel_frames'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0eda01e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...vel_frames'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0eda00a0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0eda00a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...vel_frames'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_hidden_applevel_frames'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_hidden_applevel_frames'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0f2b2910> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f2b2910> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f2b2910> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f2b2910> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f01e350> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fd05ad0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0edc8a50>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f727e50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ede0f50>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_135.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_135.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_135.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_135.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_135.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_135.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_135.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_135.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_135.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_135.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_135.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_135.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_135.c:143: E /tmp/pytest/usession-main-1197/platcheck_135.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_135.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_135.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_135.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_135.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_135.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_135.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_135.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_135.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_135.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_135.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTest.test_get_hidden_tb _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_136.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0ed70ad0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_hidden_tb'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_hidden_tb'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_hidden_tb'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_hidden_tb'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_hidden_tb'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_hidden_tb'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_hidden_tb'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0f7eeb40> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._hidden_tb'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f7eeeb0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0f7eeeb0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._hidden_tb'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_hidden_tb'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_get_hidden_tb'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0f92f350> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f92f350> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f92f350> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f92f350> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fa9b510> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e70d280> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f27ad90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0ea7ff10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0faaddd0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_136.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_136.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_136.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_136.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_136.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_136.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_136.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_136.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_136.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_136.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_136.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_136.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_136.c:143: E /tmp/pytest/usession-main-1197/platcheck_136.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_136.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_136.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_136.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_136.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_136.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_136.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_136.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_136.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_136.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_136.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTest.test_lookup_special _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_137.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f77abd0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_lookup_special'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_lookup_special'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_lookup_special'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_lookup_special'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_lookup_special'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_lookup_special'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_lookup_special'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ec4eb90> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...up_special'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec4ea00> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec4ea00> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...up_special'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_lookup_special'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_lookup_special'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0fb37990> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb37990> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fb37990> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fb37990> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ef80310> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0efd3670> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef88ad0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f440cd0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f06fbd0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_137.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_137.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_137.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_137.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_137.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_137.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_137.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_137.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_137.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_137.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_137.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_137.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_137.c:143: E /tmp/pytest/usession-main-1197/platcheck_137.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_137.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_137.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_137.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_137.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_137.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_137.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_137.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_137.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_137.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_137.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________________ ERROR at setup of AppTest.test_do_what_I_mean _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_138.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f3b2050>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_do_what_I_mean'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_do_what_I_mean'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_do_what_I_mean'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_do_what_I_mean'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_do_what_I_mean'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_do_what_I_mean'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_do_what_I_mean'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0e696c30> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...hat_I_mean'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e696820> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e696820> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...hat_I_mean'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_do_what_I_mean'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_do_what_I_mean'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0f229d10> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f229d10> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f229d10> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f229d10> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fa53750> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0fd053d0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f8b5b90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fa98c50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e7d7a10>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_138.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_138.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_138.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_138.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_138.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_138.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_138.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_138.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_138.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_138.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_138.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_138.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_138.c:143: E /tmp/pytest/usession-main-1197/platcheck_138.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_138.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_138.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_138.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_138.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_138.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_138.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_138.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_138.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_138.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_138.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTest.test_list_strategy _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_139.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f495950>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_list_strategy'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_list_strategy'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_list_strategy'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0e7faaa0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e7fa780> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e7fa780> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_list_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_list_strategy'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0e853950> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0e853950> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0e853950> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0e853950> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0fbd0d90> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0eb24210> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f2b2ed0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f9ded90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f553c50>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_139.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_139.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_139.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_139.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_139.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_139.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_139.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_139.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_139.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_139.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_139.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_139.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_139.c:143: E /tmp/pytest/usession-main-1197/platcheck_139.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_139.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_139.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_139.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_139.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_139.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_139.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_139.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_139.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_139.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_139.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTest.test_dict_strategy _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_140.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f494950>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_dict_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_dict_strategy'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_dict_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_dict_strategy'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_dict_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_dict_strategy'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_dict_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ea8fbe0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ea8f500> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ea8f500> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_dict_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_dict_strategy'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0ef2bb50> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef2bb50> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0ef2bb50> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0ef2bb50> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0efff510> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e527b40> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f5ec8d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f5eca10>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ecb0090>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_140.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_140.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_140.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_140.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_140.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_140.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_140.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_140.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_140.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_140.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_140.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_140.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_140.c:143: E /tmp/pytest/usession-main-1197/platcheck_140.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_140.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_140.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_140.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_140.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_140.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_140.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_140.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_140.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_140.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_140.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _________________ ERROR at setup of AppTest.test_set_strategy __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_141.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0eb058d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_strategy'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_strategy'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_strategy'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0e7653c0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e765780> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e765780> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_set_strategy'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0f1b2750> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f1b2750> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f1b2750> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f1b2750> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f372e90> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e6874b0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f9afc50>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f6c1ad0>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f461290>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_141.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_141.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_141.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_141.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_141.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_141.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_141.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_141.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_141.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_141.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_141.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_141.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_141.c:143: E /tmp/pytest/usession-main-1197/platcheck_141.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_141.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_141.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_141.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_141.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_141.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_141.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_141.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_141.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_141.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_141.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ _______________ ERROR at setup of AppTest.test_instance_strategy _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_142.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f4bfad0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_instance_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_instance_strategy'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_instance_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_instance_strategy'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_instance_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_instance_strategy'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_instance_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ec2dc80> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...e_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fcb7fa0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fcb7fa0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...e_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_instance_strategy'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_instance_strategy'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xfffc0fcc5890> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fcc5890> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0fcc5890> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0fcc5890> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f4930d0> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0eed3d70> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0fa537d0>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fa53f50>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e9f5ad0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_142.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_142.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_142.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_142.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_142.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_142.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_142.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_142.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_142.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_142.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_142.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_142.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_142.c:143: E /tmp/pytest/usession-main-1197/platcheck_142.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_142.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_142.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_142.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_142.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_142.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_142.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_142.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_142.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_142.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_142.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ________ ERROR at setup of AppTestJitFeatures.test_jit_backend_features ________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_143.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f132950>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_jit_backend_features'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_jit_backend_features'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_jit_backend_features'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_jit_backend_features'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_jit_backend_features'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_jit_backend_features'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_jit_backend_features'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0fc4b6e0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...d_features'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fc4be10> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0fc4be10> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...d_features'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_jit_backend_features'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_jit_backend_features'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'translation.jit': True} config = <rpython.config.config.Config object at 0xfffc0f741f10> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'incminimark', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f741f10> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0f741f10> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0f741f10> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0f024290> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0ebf3670> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0eb06f90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0eb06790>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0e9367d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_143.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_143.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_143.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_143.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_143.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_143.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_143.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_143.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_143.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_143.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_143.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_143.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_143.c:143: E /tmp/pytest/usession-main-1197/platcheck_143.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_143.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_143.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_143.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_143.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_143.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_143.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_143.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_143.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_143.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_143.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ___________ ERROR at setup of AppTestJitFeatures.test_internal_error ___________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_144.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f11b950>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_internal_error'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_internal_error'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_internal_error'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_internal_error'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_internal_error'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_internal_error'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_internal_error'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0ec0b730> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...rnal_error'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec0b3c0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0ec0b3c0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...rnal_error'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_internal_error'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_internal_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True, 'translation.jit': True} config = <rpython.config.config.Config object at 0xfffc0efe09d0> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'incminimark', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0efe09d0> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0efe09d0> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0efe09d0> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ee53310> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0f183fa0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef11a90>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0f340f90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f126fd0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_144.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_144.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_144.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_144.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_144.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_144.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_144.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_144.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_144.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_144.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_144.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_144.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_144.c:143: E /tmp/pytest/usession-main-1197/platcheck_144.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_144.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_144.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_144.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_144.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_144.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_144.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_144.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_144.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_144.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_144.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of AppTestTime.test_clock_realtime _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_145.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f36b3d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_realtime'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_clock_realtime'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_realtime'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_clock_realtime'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_realtime'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_clock_realtime'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_realtime'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0e86a7d0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...k_realtime'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has second yield") except StopIteration: pass > return call_outcome.get_result() ../_pytest/vendored_packages/pluggy.py:253: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e86aaa0> def get_result(self): if self.excinfo is None: return self.result else: ex = self.excinfo if _py3: raise ex[1].with_traceback(ex[2]) > _reraise(*ex) # noqa ../_pytest/vendored_packages/pluggy.py:279: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.vendored_packages.pluggy._CallOutcome instance at 0xfffc0e86aaa0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...k_realtime'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def __init__(self, func): try: > self.result = func() ../_pytest/vendored_packages/pluggy.py:264: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_realtime'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: return _wrapped_call(hook_impl.function(*args), self.execute) > res = hook_impl.function(*args) ../_pytest/vendored_packages/pluggy.py:596: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ item = <AppTestMethod 'test_clock_realtime'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, py.test.collect.Function): config = item.config appdirect = (config.getoption('runappdirect') or config.getoption('direct_apptest')) if (get_marker(item, name='pypy_only') and appdirect and not '__pypy__' in sys.builtin_module_names): pytest.skip('PyPy-specific test') appclass = item.getparent(py.test.Class) if appclass is not None: from pypy.tool.pytest.objspace import gettestobjspace # Make cls.space and cls.runappdirect available in tests. spaceconfig = getattr(appclass.obj, 'spaceconfig', {}) if not appdirect: spaceconfig.setdefault('objspace.std.reinterpretasserts', True) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:205: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.std.reinterpretasserts': True} config = <rpython.config.config.Config object at 0xfffc0efd4410> key = (((True, True, False, False, True, False, ...), True, None, False, False, None, ...), False, (False, 'lltype', 'c', False, True, 'ref', ...)) def gettestobjspace(**kwds): """ helper for instantiating and caching spaces for testing. """ try: config = make_config(option, **kwds) except ConflictConfigError as e: # this exception is typically only raised if a module is not available. # in this case the test should be skipped py.test.skip(str(e)) if getattr(option, 'runappdirect', None): skip_on_incompatible_interpreter(kwds) return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:25: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0efd4410> def maketestobjspace(config=None): if config is None: config = make_config(option) if config.objspace.usemodules.thread: config.translation.thread = True config.objspace.extmodules = 'pypy.tool.pytest.fake_pytest' > space = make_objspace(config) tool/pytest/objspace.py:35: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xfffc0efd4410> def make_objspace(config): from pypy.objspace.std.objspace import StdObjSpace > return StdObjSpace(config) tool/option.py:33: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace config = <rpython.config.config.Config object at 0xfffc0efd4410> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.fromcache = InternalSpaceCache(self).getorbuild self.threadlocals = ThreadLocals() # set recursion limit # sets all the internal descriptors if config is None: from pypy.config.pypyoption import get_pypy_config config = get_pypy_config(translating=False) self.config = config self.reverse_debugging = config.translation.reverse_debugger self.builtin_modules = {} self.reloading_modules = {} self.interned_strings = make_weak_value_dictionary(self, str, W_Root) self.actionflag = ActionFlag() # changed by the signal module self.check_signal_action = None # changed by the signal module make_finalizer_queue(W_Root, self) self._code_of_sys_exc_info = None self._builtin_functions_by_identifier = {'': None} # can be overridden to a subclass > self.initialize() interpreter/baseobjspace.py:467: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def initialize(self): """only for initializing the space Setup all the object types and implementations. """ setup_prebuilt(self) self.FrameClass = frame.build_frame(self) self.StringObjectCls = W_BytesObject self.UnicodeObjectCls = W_UnicodeObject self.IntObjectCls = W_IntObject self.FloatObjectCls = W_FloatObject # singletons self.w_None = W_NoneObject.w_None self.w_False = W_BoolObject.w_False self.w_True = W_BoolObject.w_True self.w_NotImplemented = self.wrap(special.NotImplemented()) self.w_Ellipsis = self.wrap(special.Ellipsis()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, W_Buffer.typedef: W_Buffer, W_BytearrayObject.typedef: W_BytearrayObject, W_BytesObject.typedef: W_BytesObject, W_ComplexObject.typedef: W_ComplexObject, W_DictMultiObject.typedef: W_DictMultiObject, W_FloatObject.typedef: W_FloatObject, W_IntObject.typedef: W_IntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, W_LongObject.typedef: W_LongObject, W_MemoryView.typedef: W_MemoryView, W_NoneObject.typedef: W_NoneObject, W_ObjectObject.typedef: W_ObjectObject, W_SetObject.typedef: W_SetObject, W_FrozensetObject.typedef: W_FrozensetObject, W_SliceObject.typedef: W_SliceObject, W_TupleObject.typedef: W_TupleObject, W_TypeObject.typedef: W_TypeObject, W_UnicodeObject.typedef: W_UnicodeObject, } self.builtin_types = {} self._interplevel_classes = {} for typedef, cls in builtin_type_classes.items(): w_type = self.gettypeobject(typedef) self.builtin_types[typedef.name] = w_type name = typedef.name # we don't expose 'space.w_str' at all, to avoid confusion # with Python 3. Instead, in Python 2, it becomes # space.w_bytes (or space.w_text). if name == 'str': name = 'bytes' setattr(self, 'w_' + name, w_type) self._interplevel_classes[w_type] = cls self.w_text = self.w_bytes # 'space.w_text' is w_unicode on Py3 self.w_dict.flag_map_or_seq = 'M' from pypy.objspace.std import dictproxyobject dictproxyobject._set_flag_map_or_seq(self) self.w_list.flag_map_or_seq = 'S' self.w_tuple.flag_map_or_seq = 'S' self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis self.w_basestring = self.builtin_types['basestring'] = \ self.gettypeobject(basestring_typedef) # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:112: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = StdObjSpace @not_rpython def make_builtins(self): "only for initializing the space." from pypy.module.exceptions.moduledef import Module w_name = self.newtext('exceptions') self.exceptions_module = Module(self, w_name) self.exceptions_module.install() from pypy.module.imp.moduledef import Module w_name = self.newtext('imp') > mod = Module(self, w_name) interpreter/baseobjspace.py:630: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xfffc0ec9b050> space = StdObjSpace, args = (W_BytesObject('imp'),) add_fork_hook = <function add_fork_hook at 0xfffc0fc5fe50> def __init__(self, space, *args): "NOT_RPYTHON" MixedModule.__init__(self, space, *args) from pypy.module.posix.interp_posix import add_fork_hook > from pypy.module.imp import interp_imp module/imp/moduledef.py:48: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat from pypy.interpreter.module import Module from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef, generic_new_descr from pypy.interpreter.error import OperationError, oefmt, wrap_oserror from pypy.interpreter.baseobjspace import W_Root, CannotHaveLock from pypy.interpreter.eval import Code from pypy.interpreter.pycode import PyCode > from pypy.interpreter.streamutil import wrap_streamerror module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from rpython.rlib.streamio import StreamError interpreter/streamutil.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # File offsets are all 'r_longlong', but a single read or write cannot # transfer more data that fits in an RPython 'int' (because that would not # fit in a single string anyway). This module needs to be careful about # where r_longlong values end up: as argument to seek() and truncate() and # return value of tell(), but not as argument to read(). import os, sys, errno from rpython.rlib.objectmodel import specialize, we_are_translated, not_rpython from rpython.rlib.rarithmetic import r_longlong, intmask > from rpython.rlib import rposix, nonconst, _rsocket_rffi as _c ../rpython/rlib/streamio.py:40: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ from rpython.rtyper.lltypesystem import rffi from rpython.rtyper.lltypesystem import lltype from rpython.rtyper.tool import rffi_platform as platform from rpython.rtyper.lltypesystem.rffi import CCHARP, CONST_CCHARP from rpython.rlib import jit from rpython.translator.tool.cbuild import ExternalCompilationInfo from rpython.translator.platform import platform as target_platform from rpython.rlib.rarithmetic import intmask, r_uint, widen import os,sys from textwrap import dedent _POSIX = os.name == "posix" _WIN32 = sys.platform == "win32" _MSVC = target_platform.name == "msvc" _MINGW = target_platform.name == "mingw32" _SOLARIS = sys.platform == "sunos5" _MACOSX = sys.platform == "darwin" _HAS_AF_PACKET = sys.platform.startswith('linux') # only Linux for now if _POSIX: includes = ('sys/types.h', 'sys/socket.h', 'sys/un.h', 'poll.h', 'sys/select.h', 'sys/types.h', 'netinet/in.h', 'netinet/tcp.h', 'unistd.h', 'fcntl.h', 'stdio.h', 'netdb.h', 'arpa/inet.h', 'stdint.h', 'errno.h', 'limits.h', 'net/if.h', ) if _HAS_AF_PACKET: includes += ('netpacket/packet.h', 'sys/ioctl.h', ) cond_includes = [('AF_NETLINK', 'linux/netlink.h')] cond_includes += [('AF_ALG', 'linux/if_alg.h')] cond_includes += [('AF_QIPCRTR', 'linux/qrtr.h')] libraries = () calling_conv = 'c' HEADER = ''.join(['#include <%s>\n' % filename for filename in includes]) COND_HEADER = ''.join(['#ifdef %s\n#include <%s>\n#endif\n' % cond_include for cond_include in cond_includes]) if _SOLARIS: libraries = libraries + ('socket', 'nsl') if _WIN32: includes = () libraries = ('ws2_32', 'Iphlpapi') calling_conv = 'win' header_lines = [ '#include <WinSock2.h>', '#include <WS2tcpip.h>', # winsock2 defines AF_UNIX, but not sockaddr_un '#undef AF_UNIX', ] if _MSVC: header_lines.extend([ '#include <Mstcpip.h>', # these types do not exist on microsoft compilers '#ifdef _WIN64', 'typedef long long ssize_t;', 'typedef unsigned long long size_t;', '#else', 'typedef int ssize_t;', 'typedef unsigned int size_t;', '#endif', 'typedef unsigned __int16 uint16_t;', 'typedef unsigned __int32 uint32_t;', ]) else: # MINGW includes = ('stdint.h',) header_lines.extend([ '''\ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif''', '#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)', '#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)', '#define RCVALL_OFF 0', '#define RCVALL_ON 1', '#define RCVALL_SOCKETLEVELONLY 2', '''\ #ifndef __MINGW32__ struct tcp_keepalive { u_long onoff; u_long keepalivetime; u_long keepaliveinterval; }; #endif ''' ]) HEADER = '\n'.join(header_lines) COND_HEADER = '' constants = {} eci = ExternalCompilationInfo( post_include_bits = [HEADER, COND_HEADER], includes = includes, libraries = libraries, ) class CConfig: _compilation_info_ = eci # constants linux = platform.Defined('linux') WIN32 = platform.Defined('_WIN32') O_RDONLY = platform.DefinedConstantInteger('O_RDONLY') O_WRONLY = platform.DefinedConstantInteger('O_WRONLY') O_RDWR = platform.DefinedConstantInteger('O_RDWR') O_NONBLOCK = platform.DefinedConstantInteger('O_NONBLOCK') F_GETFL = platform.DefinedConstantInteger('F_GETFL') F_SETFL = platform.DefinedConstantInteger('F_SETFL') FIONBIO = platform.DefinedConstantInteger('FIONBIO') PIPE_BUF = platform.DefinedConstantInteger('PIPE_BUF') INVALID_SOCKET = platform.DefinedConstantInteger('INVALID_SOCKET') INET_ADDRSTRLEN = platform.DefinedConstantInteger('INET_ADDRSTRLEN') INET6_ADDRSTRLEN= platform.DefinedConstantInteger('INET6_ADDRSTRLEN') EINTR = platform.DefinedConstantInteger('EINTR') WSAEINTR = platform.DefinedConstantInteger('WSAEINTR') EINPROGRESS = platform.DefinedConstantInteger('EINPROGRESS') WSAEINPROGRESS = platform.DefinedConstantInteger('WSAEINPROGRESS') EWOULDBLOCK = platform.DefinedConstantInteger('EWOULDBLOCK') WSAEWOULDBLOCK = platform.DefinedConstantInteger('WSAEWOULDBLOCK') EAFNOSUPPORT = platform.DefinedConstantInteger('EAFNOSUPPORT') WSAEAFNOSUPPORT = platform.DefinedConstantInteger('WSAEAFNOSUPPORT') EISCONN = platform.DefinedConstantInteger('EISCONN') WSAEISCONN = platform.DefinedConstantInteger('WSAEISCONN') constant_names = ''' AF_AAL5 AF_ALG AF_APPLETALK AF_ASH AF_ATMPVC AF_ATMSVC AF_AX25 AF_BLUETOOTH AF_BRIDGE AF_CAN AD_DECnet AF_DEC AF_DECnet AF_DIVERT AF_ECONET AF_HYPERV AF_INET AF_INET6 AF_IPX AF_IRDA AF_KEY AF_LINK AF_LLC AF_NETBEUI AF_NETLINK AF_NETROM AF_PACKET AF_PPPOX AF_QIPCRTR AF_RDS AF_ROSE AF_ROUTE AF_SECURITY AF_SNA AF_SYSTEM AF_TIPC AF_UNIX AF_VSOCK AF_WANPIPE AF_X25 AF_UNSPEC AI_ADDRCONFIG AI_ALL AI_CANONNAME AI_DEFAULT AI_MASK AI_NUMERICHOST AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED AI_V4MAPPED_CFG BTPROTO_HCI BTPROTO_L2CAP BTPROTO_SCO BTPROTO_RFCOMM ALG_OP_DECRYPT ALG_OP_ENCRYPT ALG_OP_SIGN ALG_OP_VERIFY ALG_SET_AEAD_ASSOCLEN ALG_SET_AEAD_AUTHSIZE ALG_SET_IV ALG_SET_KEY ALG_SET_OP ALG_SET_PUBKEY SOL_ALG HCI_DATA_DIR HCI_FILTER HCI_TIME_STAMP HV_PROTOCOL_RAW HVSOCKET_ADDRESS_FLAG_PASSTHRU HVSOCKET_CONNECTED_SUSPEND HVSOCKET_CONNECT_TIMEOUT HVSOCKET_CONNECT_TIMEOUT_MAX INADDR_ALLHOSTS_GROUP INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_MAX_LOCAL_GROUP INADDR_NONE INADDR_UNSPEC_GROUP IOCTL_VM_SOCKETS_GET_LOCAL_CID EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY EAI_MAX EAI_MEMORY EAI_NODATA EAI_NONAME EAI_OVERFLOW EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM IPPROTO_AH IPPROTO_BIP IPPROTO_CBT IPPROTO_DSTOPTS IPPROTO_EGP IPPROTO_EON IPPROTO_ESP IPPROTO_FRAGMENT IPPROTO_GGP IPPROTO_GRE IPPROTO_HELLO IPPROTO_HOPOPTS IPPROTO_ICLFXBM IPPROTO_ICMPV6 IPPROTO_IDP IPPROTO_IGP IPPROTO_IGMP IPPROTO_IPCOMP IPPROTO_IPIP IPPROTO_IPV4 IPPROTO_IPV6 IPPROTO_L2TP IPPROTO_MAX IPPROTO_MOBILE IPPROTO_ND IPPROTO_NONE IPPROTO_PGM IPPROTO_PIM IPPROTO_PUP IPPROTO_RDP IPPROTO_ROUTING IPPROTO_RSVP IPPROTO_MPTCP IPPROTO_ST IPPROTO_TCP IPPROTO_TP IPPROTO_UDPLITE IPPROTO_VRRP IPPROTO_XTP IPPROTO_SCTP IPV6_CHECKSUM IPV6_DONTFRAG IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_JOIN_GROUP IPV6_LEAVE_GROUP IPV6_MULTICAST_HOPS IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_NEXTHOP IPV6_PATHMTU IPV6_PKTINFO IPV6_RECVDSTOPTS IPV6_RECVHOPLIMIT IPV6_RECVHOPOPTS IPV6_RECVPATHMTU IPV6_RECVPKTINFO IPV6_RECVRTHDR IPV6_RECVTCLASS IPV6_RTHDR IPV6_RTHDRDSTOPTS IPV6_RTHDR_TYPE_0 IPV6_TCLASS IPV6_UNICAST_HOPS IPV6_USE_MIN_MTU IPV6_V6ONLY IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT IP_BLOCK_SOURCE IP_DEFAULT_MULTICAST_LOOP IP_DEFAULT_MULTICAST_TTL IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_HDRINCL IP_MAX_MEMBERSHIPS IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL IP_OPTIONS IP_PKTINFO IP_RECVDSTADDR IP_RECVOPTS IP_RECVRETOPTS IP_RECVTOS IP_RETOPTS IP_TOS IP_TRANSPARENT IP_TTL IP_UNBLOCK_SOURCE MSG_BCAST MSG_BTAG MSG_CMSG_CLOEXEC MSG_CONFIRM MSG_CTRUNC MSG_DONTROUTE MSG_DONTWAIT MSG_EOF MSG_ERRQUEUE MSG_EOR MSG_ETAG MSG_FASTOPEN MSG_MCAST MSG_MORE MSG_NOSIGNAL MSG_NOTIFICATION MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL NI_DGRAM NI_IDN NI_MAXHOST NI_MAXSERV NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV NETLINK_ARPD NETLINK_CRYPTO NETLINK_DNRTMSG NETLINK_FIREWALL NETLINK_IP6_FW NETLINK_NFLOG NETLINK_ROUTE NETLINK_ROUTE6 NETLINK_SKIP NETLINK_TAPBASE NETLINK_TCPDIAG NETLINK_USERSOCK NETLINK_W1 NETLINK_XFRM PACKET_HOST PACKET_BROADCAST PACKET_MULTICAST PACKET_OTHERHOST PACKET_OUTGOING PACKET_LOOPBACK PACKET_FASTROUTE PF_CAN PF_DIVERT PF_PACKET PF_RDS PF_SYSTEM RCVALL_IPLEVEL RCVALL_MAX RCVALL_OFF RCVALL_ON RCVALL_SOCKETLEVELONLY RDS_CANCEL_SENT_TO RDS_CMSG_RDMA_ARGS RDS_CMSG_RDMA_DEST RDS_CMSG_RDMA_MAP RDS_CMSG_RDMA_STATUS RDS_CMSG_RDMA_UPDATE RDS_CONG_MONITOR RDS_FREE_MR RDS_GET_MR RDS_GET_MR_FOR_DEST RDS_RDMA_DONTWAIT RDS_RDMA_FENCE RDS_RDMA_INVALIDATE RDS_RDMA_NOTIFY_ME RDS_RDMA_READWRITE RDS_RDMA_SILENT RDS_RDMA_USE_ONCE RDS_RECVERR SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM SOCK_CLOEXEC SOCK_NONBLOCK SOL_SOCKET SOL_IPX SOL_AX25 SOL_ATALK SOL_NETROM SOL_ROSE SO_ACCEPTCONN SO_BINDTODEVICE SO_BINDTOIFINDEX SO_BROADCAST SO_DEBUG SO_DOMAIN SO_DONTROUTE SO_ERROR SO_EXCLUSIVEADDRUSE SO_INCOMING_CPU SO_J1939_ERRQUEUE SO_J1939_FILTER SO_J1939_PROMISC SO_J1939_SEND_PRIO SO_KEEPALIVE SO_LINGER SO_MARK SO_OOBINLINE SO_PASSCRED SO_PASSSEC SO_PEERCRED SO_PEERSEC SO_PRIORITY SO_PROTOCOL SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT SO_RTABLE SO_SETFIB SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO SO_TYPE SO_USELOOPBACK SO_USER_COOKIE SO_VM_SOCKETS_BUFFER_MAX_SIZE SO_VM_SOCKETS_BUFFER_MIN_SIZE SO_VM_SOCKETS_BUFFER_SIZE SIO_KEEPALIVE_VALS SIO_LOOPBACK_FAST_PATH SIO_RCVALL SYSPROTO_CONTROL TCP_CC_INFO TCP_CONGESTION TCP_CONNECTION_INFO TCP_CORK TCP_DEFER_ACCEPT TCP_FASTOPEN TCP_FASTOPEN_CONNECT TCP_FASTOPEN_KEY TCP_FASTOPEN_NO_COOKIE TCP_INFO TCP_INQ TCP_KEEPALIVE TCP_KEEPCNT TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXSEG TCP_MD5SIG TCP_MD5SIG_EXT TCP_NODELAY TCP_NOTSENT_LOWAT TCP_QUEUE_SEQ TCP_QUICKACK TCP_REPAIR TCP_REPAIR_OPTIONS TCP_REPAIR_QUEUE TCP_REPAIR_WINDOW TCP_SAVED_SYN TCP_SAVE_SYN TCP_SYNCNT TCP_THIN_DUPACK TCP_THIN_LINEAR_TIMEOUTS TCP_TIMESTAMP TCP_TX_DELAY TCP_ULP TCP_USER_TIMEOUT TCP_WINDOW_CLAMP TCP_ZEROCOPY_RECEIVE IPX_TYPE LOCAL_CREDS LOCAL_CREDS_PERSISTENT LOCAL_PEERCRED SCM_CREDENTIALS SCM_CREDS SCM_CREDS2 SCM_J1939_DEST_ADDR SCM_J1939_DEST_NAME SCM_J1939_ERRQUEUE SCM_J1939_PRIO SCM_RIGHTS CAN_BCM CAN_BCM_CAN_FD_FRAME CAN_BCM_RX_ANNOUNCE_RESUME CAN_BCM_RX_CHANGED CAN_BCM_RX_CHECK_DLC CAN_BCM_RX_DELETE CAN_BCM_RX_FILTER_ID CAN_BCM_RX_NO_AUTOTIMER CAN_BCM_RX_READ CAN_BCM_RX_RTR_FRAME CAN_BCM_RX_SETUP CAN_BCM_RX_STATUS CAN_BCM_RX_TIMEOUT CAN_BCM_SETTIMER CAN_BCM_STARTTIMER CAN_BCM_TX_ANNOUNCE CAN_BCM_TX_COUNTEVT CAN_BCM_TX_CP_CAN_ID CAN_BCM_TX_DELETE CAN_BCM_TX_EXPIRED CAN_BCM_TX_READ CAN_BCM_TX_RESET_MULTI_IDX CAN_BCM_TX_SEND CAN_BCM_TX_SETUP CAN_BCM_TX_STATUS CAN_EFF_FLAG CAN_EFF_MASK CAN_ERR_FLAG CAN_ERR_MASK CAN_ISOTP CAN_J1939 CAN_RAW CAN_RAW_ERR_FILTER CAN_RAW_FD_FRAMES CAN_RAW_FILTER CAN_RAW_JOIN_FILTERS CAN_RAW_LOOPBACK CAN_RAW_RECV_OWN_MSGS CAN_RTR_FLAG CAN_SFF_MASK J1939_EE_INFO_NONE J1939_EE_INFO_TX_ABORT J1939_FILTER_MAX J1939_IDLE_ADDR J1939_MAX_UNICAST_ADDR J1939_NLA_BYTES_ACKED J1939_NLA_PAD J1939_NO_ADDR J1939_NO_NAME J1939_NO_PGN J1939_PGN_ADDRESS_CLAIMED J1939_PGN_ADDRESS_COMMANDED J1939_PGN_MAX J1939_PGN_PDU1_MAX J1939_PGN_REQUEST ETH_P_ALL ETHERTYPE_ARP ETHERTYPE_IP ETHERTYPE_IPV6 ETHERTYPE_VLAN UDPLITE_RECV_CSCOV UDPLITE_SEND_CSCOV TIPC_ADDR_ID TIPC_ADDR_NAME TIPC_ADDR_NAMESEQ TIPC_CFG_SRV TIPC_CLUSTER_SCOPE TIPC_CONN_TIMEOUT TIPC_CRITICAL_IMPORTANCE TIPC_DEST_DROPPABLE TIPC_HIGH_IMPORTANCE TIPC_IMPORTANCE TIPC_LOW_IMPORTANCE TIPC_MEDIUM_IMPORTANCE TIPC_NODE_SCOPE TIPC_PUBLISHED TIPC_SRC_DROPPABLE TIPC_SUBSCR_TIMEOUT TIPC_SUB_CANCEL TIPC_SUB_PORTS TIPC_SUB_SERVICE TIPC_TOP_SRV TIPC_WAIT_FOREVER TIPC_WITHDRAWN TIPC_ZONE_SCOPE VMADDR_CID_ANY VMADDR_CID_HOST VMADDR_PORT_ANY VM_SOCKETS_INVALID_VERSION POLLIN POLLPRI POLLOUT POLLERR POLLHUP POLLNVAL POLLRDNORM POLLRDBAND POLLWRNORM POLLWEBAND POLLMSG FD_READ FD_WRITE FD_ACCEPT FD_CONNECT FD_CLOSE WSA_WAIT_TIMEOUT WSA_WAIT_FAILED INFINITE FD_CONNECT_BIT FD_CLOSE_BIT WSA_IO_PENDING WSA_IO_INCOMPLETE WSA_INVALID_HANDLE WSA_INVALID_PARAMETER WSA_NOT_ENOUGH_MEMORY WSA_OPERATION_ABORTED WSA_FLAG_OVERLAPPED WSA_FLAG_NO_HANDLE_INHERIT SIO_RCVALL SIO_KEEPALIVE_VALS SIOCGIFNAME SIOCGIFINDEX SO_DOMAIN SO_PROTOCOL SO_PEERSEC SO_PASSSEC TCP_USER_TIMEOUT TCP_CONGESTION TCP_NOTSENT_LOWAT '''.split() for name in constant_names: setattr(CConfig, name, platform.DefinedConstantInteger(name)) if _WIN32: # some SDKs define these values with an enum, #ifdef won't work for name in ('RCVALL_ON', 'RCVALL_OFF', 'RCVALL_SOCKETLEVELONLY', 'TCP_FASTOPEN'): setattr(CConfig, name, platform.ConstantInteger(name)) constant_names.append(name) constants["BDADDR_ANY"] = "00:00:00:00:00:00" constants["BDADDR_LOCAL"] = "00:00:00:FF:FF:FF" constants_w_defaults = [('SOL_IP', 0), ('SOL_TCP', 6), ('SOL_UDP', 17), ('SOMAXCONN', 5), ('IPPROTO_IP', 6), ('IPPROTO_IPV6', 41), ('IPPROTO_ICMP', 1), ('IPPROTO_TCP', 6), ('IPPROTO_UDP', 17), ('IPPROTO_RAW', 255), ('IPPORT_RESERVED', 1024), ('IPPORT_USERRESERVED', 5000), ('INADDR_ANY', 0x00000000), ('INADDR_BROADCAST', 0xffffffff), ('INADDR_LOOPBACK', 0x7F000001), ('INADDR_UNSPEC_GROUP', 0xe0000000), ('INADDR_ALLHOSTS_GROUP', 0xe0000001), ('INADDR_MAX_LOCAL_GROUP', 0xe00000ff), ('INADDR_NONE', 0xffffffff), ('SHUT_RD', 0), ('SHUT_WR', 1), ('SHUT_RDWR', 2), ('POLLIN', 1), ('POLLPRI', 2), ('POLLOUT', 4), ('POLLERR', 8), ('POLLHUP', 16), ('FD_SETSIZE', 64), ] for name, default in constants_w_defaults: setattr(CConfig, name, platform.DefinedConstantInteger(name)) # types if _MSVC: socketfd_type = lltype.Unsigned else: socketfd_type = rffi.INT_real CConfig.uint16_t = platform.SimpleType('uint16_t', rffi.USHORT) CConfig.uint32_t = platform.SimpleType('uint32_t', rffi.UINT) CConfig.size_t = platform.SimpleType('size_t', rffi.INT) CConfig.ssize_t = platform.SimpleType('ssize_t', rffi.INT) CConfig.socklen_t = platform.SimpleType('socklen_t', rffi.UINT_real) sockaddr_ptr = lltype.Ptr(lltype.ForwardReference()) addrinfo_ptr = lltype.Ptr(lltype.ForwardReference()) # struct types CConfig.sockaddr = platform.Struct('struct sockaddr', [('sa_family', rffi.INT), ('sa_data', rffi.CFixedArray(rffi.CHAR, 1)), ]) CConfig.in_addr = platform.Struct('struct in_addr', [('s_addr', rffi.UINT)]) CConfig.in6_addr = platform.Struct('struct in6_addr', [('s6_addr', rffi.CFixedArray(rffi.CHAR, 16))]) CConfig.sockaddr_in = platform.Struct('struct sockaddr_in', [('sin_family', rffi.INT), ('sin_port', rffi.USHORT), ('sin_addr', CConfig.in_addr)]) CConfig.sockaddr_in6 = platform.Struct('struct sockaddr_in6', [('sin6_family', rffi.INT), ('sin6_port', rffi.USHORT), ('sin6_flowinfo', rffi.INT), ('sin6_addr', CConfig.in6_addr), ('sin6_scope_id', rffi.INT)]) CConfig.sockaddr_un = platform.Struct('struct sockaddr_un', [('sun_family', rffi.INT), ('sun_path', rffi.CFixedArray(rffi.CHAR, 1))], ifdef='AF_UNIX') CConfig.sockaddr_nl = platform.Struct('struct sockaddr_nl', [('nl_family', rffi.INT), ('nl_pid', rffi.INT), ('nl_groups', rffi.INT)], ifdef='AF_NETLINK') CConfig.sockaddr_alg = platform.Struct('struct sockaddr_alg', [('salg_family', rffi.INT), ('salg_type', rffi.CFixedArray(rffi.CHAR, 14)), ('salg_feat', rffi.SHORT), ('salg_mask', rffi.SHORT), ('salg_name', rffi.CFixedArray(rffi.CHAR, 64)), ], ifdef='AF_ALG') CConfig.sockaddr_qrtr = platform.Struct('struct sockaddr_qrtr', [('sq_family', rffi.INT), ('sq_node', rffi.INT), ('sq_port', rffi.INT), ], ifdef='AF_ALG') CConfig.addrinfo = platform.Struct('struct addrinfo', [('ai_flags', rffi.INT), ('ai_family', rffi.INT), ('ai_socktype', rffi.INT), ('ai_protocol', rffi.INT), ('ai_addrlen', rffi.INT), ('ai_addr', sockaddr_ptr), ('ai_canonname', CCHARP), ('ai_next', addrinfo_ptr)]) CConfig.hostent = platform.Struct('struct hostent', [('h_name', CCHARP), ('h_aliases', rffi.CCHARPP), ('h_addrtype', rffi.INT), ('h_length', rffi.INT), ('h_addr_list', rffi.CCHARPP), ]) CConfig.servent = platform.Struct('struct servent', [('s_name', CCHARP), ('s_port', rffi.INT), ('s_proto', CCHARP), ]) CConfig.protoent = platform.Struct('struct protoent', [('p_proto', rffi.INT), ]) CConfig.HAVE_ACCEPT4 = platform.Has('accept4') if _POSIX: CConfig.nfds_t = platform.SimpleType('nfds_t') CConfig.pollfd = platform.Struct('struct pollfd', [('fd', socketfd_type), ('events', rffi.SHORT), ('revents', rffi.SHORT)]) CConfig.if_nameindex_s = platform.Struct('struct if_nameindex', [('if_index', rffi.UINT), ('if_name', rffi.CCHARP)]) if _HAS_AF_PACKET: CConfig.sockaddr_ll = platform.Struct('struct sockaddr_ll', [('sll_family', rffi.INT), ('sll_ifindex', rffi.INT), ('sll_protocol', rffi.INT), ('sll_pkttype', rffi.INT), ('sll_hatype', rffi.INT), ('sll_addr', rffi.CFixedArray(rffi.UCHAR, 8)), ('sll_halen', rffi.INT)]) CConfig.ifreq = platform.Struct('struct ifreq', [('ifr_ifindex', rffi.INT), ('ifr_name', rffi.CFixedArray(rffi.CHAR, 8))]) else: CConfig.if_nameindex_s = rffi.CStruct('if_nameindex', ('if_index', rffi.UINT), ('if_name', rffi.CCHARP)) includes = [] separate_module_sources = [] post_include_bits = [] # insert handler for sendmsg / recvmsg here HAVE_SENDMSG = bool(_POSIX) if HAVE_SENDMSG: includes += ['stddef.h', 'sys/socket.h', 'unistd.h', 'string.h', 'stdlib.h', 'errno.h', 'limits.h', 'stdio.h', 'sys/types.h', 'netinet/in.h', 'arpa/inet.h'] separate_module_sources += [''' // special defines for returning from recvmsg #define BAD_MSG_SIZE_GIVEN -10000 #define BAD_ANC_SIZE_GIVEN -10001 #define MAL_ANC -10002 // special defines for returning from sendmsg #define MUL_MSGS_NOT_SUP -1000 #define ANC_DATA_TOO_LARGE -1001 #define ANC_DATA_TOO_LARGEX -1002 #if INT_MAX > 0x7fffffff #define SOCKLEN_T_LIMIT 0x7fffffff #else #define SOCKLEN_T_LIMIT INT_MAX #endif // ######################################################################### // Recvmsg implementation and associated functions // Taken from CPython. Determines the minimum memory space required for the ancillary data. #ifdef CMSG_SPACE static int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ if (cmsgh == NULL || msg->msg_control == NULL) return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a tautological comparison warning under Clang when compared against 0. Since the check is valid on other platforms, silence the warning under Clang. */ #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wtautological-compare" #endif #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif if (msg->msg_controllen < 0) return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop #endif #ifdef __clang__ #pragma clang diagnostic pop #endif if (space < cmsg_len_end) space = cmsg_len_end; cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); } #endif // Taken from CPython. #ifdef CMSG_LEN /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set *space to number of bytes following it in the buffer and return true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; return 1; } // Taken from CPython. /* If cmsgh is invalid or not contained in the buffer pointed to by msg->msg_control, return -1. If cmsgh is valid and its associated data is entirely contained in the buffer, set *data_len to the length of the associated data and return 0. If only part of the associated data is contained in the buffer but cmsgh is otherwise valid, set *data_len to the length contained in the buffer and return 1. */ static int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) { size_t space, cmsg_data_len; if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) || cmsgh->cmsg_len < CMSG_LEN(0)) return -1; cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0); if (!get_cmsg_data_space(msg, cmsgh, &space)) return -1; if (space >= cmsg_data_len) { *data_len = cmsg_data_len; return 0; } *data_len = space; return 1; } #endif /* CMSG_LEN */ /* Structure meant to hold the information received after a recvmsg is performed. Essentially it holds: the address, the message, the ancillary data and the return flags. I use this structure for 2 main reasons: - keep things ordered - some of the ancillary parameters need to be int not long (rffi SignedP is actually long*), therefore I cannot use the parameters directly */ struct recvmsg_info { struct sockaddr* address; // address fields socklen_t addrlen; int size_of_ancillary; // ancillary fields int* levels; int* types; char** file_descr; int* descr_per_ancillary; int retflag; // return flag field }; /* Wrapper function over recvmsg. Since it returns a lot of data, in a structure that is hard to parse in rffi, it was implemented in C. All the parameters, save the socket fd, message_size, ancillary_size will be malloc'd and/or modified. */ RPY_EXTERN int recvmsg_implementation( int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* retflag) { struct sockaddr* recvd_address; socklen_t recvd_addrlen; struct msghdr msg = {0}; void *controlbuf = NULL; struct cmsghdr *cmsgh; int cmsg_status; struct recvmsg_info* retinfo; int error_flag = 0; // variable to be set in case of special errors. int cmsgdatalen = 0; size_t i; // variables that are set to 1, if the message charp has been allocated // and if the ancillary variables have been allocated. To be used in case of failure. int iov_alloc = 0; int anc_alloc = 0; retinfo = (struct recvmsg_info*) malloc(sizeof(struct recvmsg_info)); if (ancillary_size > SOCKLEN_T_LIMIT){ error_flag = BAD_ANC_SIZE_GIVEN; goto fail; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0) { iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); for (i=0; i < no_of_messages; i++) { iovs[i].iov_base = messages[i]; iovs[i].iov_len = message_lengths[i]; } } // Setup the ancillary buffer memory controlbuf = malloc(ancillary_size); // Setup the recv address memory recvd_addrlen = sizeof(struct sockaddr_storage); recvd_address = (struct sockaddr*) malloc(recvd_addrlen); memset(recvd_address, 0,recvd_addrlen); // Setup the msghdr struct msg.msg_name = recvd_address; msg.msg_namelen = recvd_addrlen; msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; msg.msg_control = controlbuf; msg.msg_controllen = ancillary_size; // Link my structure to the msghdr fields retinfo->address = msg.msg_name; iov_alloc = 1; ssize_t bytes_recvd = 0; bytes_recvd = recvmsg(socket_fd, &msg, flags); if (bytes_recvd < 0){ goto fail; } retinfo->addrlen = (socklen_t) msg.msg_namelen; // Count the ancillary items & allocate the memory int anc_counter = 0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { anc_counter++; } retinfo->size_of_ancillary = anc_counter; retinfo->file_descr = (char**) malloc (anc_counter * sizeof(char*)); retinfo->levels = (int*) malloc(anc_counter * sizeof(int)); retinfo->types = (int*) malloc(anc_counter * sizeof(int)); retinfo->descr_per_ancillary = (int*) malloc(anc_counter * sizeof(int)); anc_alloc = 1; // Extract the ancillary items i=0; for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t local_size = 0; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &local_size); if (cmsg_status !=0 ){ error_flag = MAL_ANC; goto err_closefds; } retinfo->file_descr[i] = (char*) malloc(local_size); memcpy(retinfo->file_descr[i], CMSG_DATA(cmsgh), local_size); retinfo->levels[i] = cmsgh->cmsg_level; retinfo->types[i] = cmsgh->cmsg_type; retinfo->descr_per_ancillary[i] =local_size; i++; } retinfo->retflag = msg.msg_flags; // Set the parameters of address memcpy(address,retinfo->address,retinfo->addrlen); *addrlen = retinfo->addrlen; // Set the parameters of message size_of_ancillary[0] = retinfo->size_of_ancillary; // Set the parameters of ancillary *levels = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *types = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); *descr_per_ancillary = (long*) malloc (sizeof(long) * retinfo->size_of_ancillary); int counter = 0; for (i=0; i < retinfo->size_of_ancillary; i++){ counter += retinfo->descr_per_ancillary[i]; // Convert the int* to long* levels[0][i] = (long) retinfo->levels[i]; types[0][i] = (long) retinfo->types[i]; descr_per_ancillary[0][i] = (long) retinfo->descr_per_ancillary[i]; } *file_descr = (char*) malloc (sizeof(char) * counter); memset(*file_descr, 0, sizeof(char) * counter); counter = 0; for (i=0; i<retinfo->size_of_ancillary; i++){ memcpy(*file_descr+counter,retinfo->file_descr[i], retinfo->descr_per_ancillary[i]); counter += retinfo->descr_per_ancillary[i]; } // Set the retflag retflag[0] = retinfo->retflag; // Free the memory free(retinfo->address); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); for (i = 0; i < retinfo->size_of_ancillary; i++) free(retinfo->file_descr[i]); free(retinfo->file_descr); free(retinfo); free(controlbuf); if (iovs != NULL) free(iovs); return bytes_recvd; fail: if (anc_alloc){ free(retinfo->file_descr); free(retinfo->levels); free(retinfo->types); free(retinfo->descr_per_ancillary); free(retinfo->address); free(retinfo); free(controlbuf); }else{ if (iov_alloc){ free(retinfo->address); free(controlbuf); free(retinfo); } } if (iovs != NULL) free(iovs); if (error_flag==0) error_flag = -1; return error_flag; err_closefds: // Special case for UNIX sockets. In case file descriptors are received, they need to be closed. // Taken from CPython #ifdef SCM_RIGHTS /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */ for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { size_t dataleng; cmsg_status = get_cmsg_data_len(&msg, cmsgh, &dataleng); cmsgdatalen = (int) dataleng; if (cmsg_status < 0) break; if (cmsgh->cmsg_level == SOL_SOCKET && cmsgh->cmsg_type == SCM_RIGHTS) { size_t numfds; int *fdp; numfds = cmsgdatalen / sizeof(int); fdp = (int *)CMSG_DATA(cmsgh); while (numfds-- > 0) close(*fdp++); } if (cmsg_status != 0) break; } #endif /* SCM_RIGHTS */ goto fail; } // ########################################################################## // Sendmsg implementation and associated functions #ifdef CMSG_LEN static int get_CMSG_LEN(size_t length, size_t *result) { size_t tmp; if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0))) return 0; tmp = CMSG_LEN(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif #ifdef CMSG_SPACE /* If length is in range, set *result to CMSG_SPACE(length) and return true; otherwise, return false. */ static int get_CMSG_SPACE(size_t length, size_t *result) { size_t tmp; /* Use CMSG_SPACE(1) here in order to take account of the padding necessary before *and* after the data. */ if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1))) return 0; tmp = CMSG_SPACE(length); if ((tmp > SOCKLEN_T_LIMIT) || (tmp < length)) return 0; *result = tmp; return 1; } #endif /* sendmsg_implementation is a wrapper over sendmsg of the API. It was inspired from the way CPython did their implementation of this. The main reason that it was written in C, is the struct msghdr, which contains the ancillary data in a linked list of cmsghdr structures. It was simpler to use it in C, and then push the simpler types of data via rffi. */ RPY_EXTERN int sendmsg_implementation (int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag ) { struct msghdr msg = {0}; struct cmsghdr *cmsg; void* controlbuf = NULL; int retval; size_t i; // Prepare the msghdr structure for the send: // Add the address if (address != NULL) { msg.msg_name = address; msg.msg_namelen = addrlen; } // Add the message struct iovec *iovs = NULL; if (no_of_messages > 0){ iovs = (struct iovec*) malloc(no_of_messages * sizeof(struct iovec)); memset(iovs, 0, no_of_messages * sizeof(struct iovec)); msg.msg_iov = iovs; msg.msg_iovlen = no_of_messages; for (i=0; i < no_of_messages; i++){ iovs[i].iov_base = messages[i]; iovs[i].iov_len = length_of_messages[i]; } } // Add the ancillary #ifndef CMSG_SPACE if (control_length > 1){ free(iovs); return MUL_MSGS_NOT_SUP; } #endif if (control_length > 0){ //compute the total size of the ancillary //getting the exact amount of space can be tricky and os dependent. size_t total_size_of_ancillary = 0; size_t space; size_t controllen = 0, controllen_last = 0; for (i = 0; i< control_length; i++){ total_size_of_ancillary = no_of_fds[i]; #ifdef CMSG_SPACE if (!get_CMSG_SPACE(total_size_of_ancillary, &space)) { #else if (!get_CMSG_LEN(total_size_of_ancillary, &space)) { #endif if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGE; } controllen +=space; if ((controllen > SOCKLEN_T_LIMIT) || (controllen < controllen_last)) { if (iovs != NULL) free(iovs); return ANC_DATA_TOO_LARGEX; } controllen_last = controllen; } controlbuf = malloc(controllen); msg.msg_control = controlbuf; msg.msg_controllen = controllen; // memset controlbuf to 0 to avoid trash in the ancillary memset(controlbuf, 0, controllen); cmsg = NULL; for (i = 0; i < control_length; i++) { cmsg = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsg); cmsg->cmsg_level = (int) levels[i]; cmsg->cmsg_type = (int) types[i]; cmsg->cmsg_len = CMSG_LEN(sizeof(char) * no_of_fds[i]); memcpy(CMSG_DATA(cmsg), file_descriptors[i], sizeof(char) * no_of_fds[i]); } } // Add the flags msg.msg_flags = flag; // Send the data retval = sendmsg(socket, &msg, flag); // free everything that was allocated here, and we would not need in rsocket if (iovs != NULL) free(iovs); if (controlbuf !=NULL) free(controlbuf); return retval; } // ############################################################################ // Wrappers for CMSG_SPACE and CMSG_LEN /* These 2 functions are wrappers over sys/socket.h's CMSG_SPACE and CMSG_LEN. They are identical to CPython's. */ #ifdef CMSG_SPACE RPY_EXTERN size_t CMSG_SPACE_wrapper(size_t desired_space){ size_t result; if (!get_CMSG_SPACE(desired_space, &result)){ return 0; } return result; } #endif #ifdef CMSG_LEN RPY_EXTERN size_t CMSG_LEN_wrapper(size_t desired_len){ size_t result; if (!get_CMSG_LEN(desired_len, &result)){ return 0; } return result; } #endif // ########################################################################### // Extra functions that I needed /* This function is used to memcpy from a char* at an offset. Could not get rffi.c_memcpy to do it at an offset, so I made my own. */ RPY_EXTERN int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size){ *stringto = memcpy(*stringto, stringfrom + offset, size); return 0; } /* These functions free memory that was allocated in C (sendmsg or recvmsg) was used in rsocket and now needs cleanup */ RPY_EXTERN int free_pointer_to_signedp(long** ptrtofree){ free(*ptrtofree); return 0; } RPY_EXTERN int free_ptr_to_charp(char** ptrtofree){ free(*ptrtofree); return 0; } ''',] post_include_bits +=[ "RPY_EXTERN " "int sendmsg_implementation(int socket, struct sockaddr* address, socklen_t addrlen, long* length_of_messages, char** messages, int no_of_messages, long* levels, long* types, char** file_descriptors, long* no_of_fds, int control_length, int flag );\n" "RPY_EXTERN " "int recvmsg_implementation(int socket_fd, int ancillary_size, int flags, struct sockaddr* address, socklen_t* addrlen, int* message_lengths, char** messages, int no_of_messages, long* size_of_ancillary, long** levels, long** types, char** file_descr, long** descr_per_ancillary, long* flag);\n" "static " "int cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space);\n" "static " "int get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space);\n" "static " "int get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len);\n" "static " "int get_CMSG_LEN(size_t length, size_t *result);\n" "static " "int get_CMSG_SPACE(size_t length, size_t *result);\n" "RPY_EXTERN " "size_t CMSG_LEN_wrapper(size_t desired_len);\n" "RPY_EXTERN " "size_t CMSG_SPACE_wrapper(size_t desired_space);\n" "RPY_EXTERN " "int memcpy_from_CCHARP_at_offset_and_size(char* stringfrom, char** stringto, int offset, int size);\n" "RPY_EXTERN " "int free_pointer_to_signedp(long** ptrtofree);\n" "RPY_EXTERN " "int free_ptr_to_charp(char** ptrtofree);\n" ] if _WIN32: CConfig.WSAEVENT = platform.SimpleType('WSAEVENT', rffi.VOIDP) CConfig.WSANETWORKEVENTS = platform.Struct( 'struct _WSANETWORKEVENTS', [('lNetworkEvents', rffi.LONG), ('iErrorCode', rffi.CFixedArray(rffi.INT, 10)), #FD_MAX_EVENTS ]) CConfig.WSAPROTOCOL_INFO = platform.Struct( 'WSAPROTOCOL_INFOA', []) # Struct is just passed between functions CConfig.FROM_PROTOCOL_INFO = platform.DefinedConstantInteger( 'FROM_PROTOCOL_INFO') post_include_bits +=[dedent("""\ struct if_nameindex { unsigned int if_index; char * if_name; }; RPY_EXTERN struct if_nameindex * if_nameindex(void); RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr); """)] separate_module_sources += [dedent("""\ #include <Iphlpapi.h> #include <stdlib.h> RPY_EXTERN struct if_nameindex * if_nameindex(void) { PMIB_IF_TABLE2 tbl; int ret; if (GetIfTable2Ex(MibIfTableRaw, &tbl) != NO_ERROR) { return NULL; } size_t memsize = sizeof(struct if_nameindex) * (tbl->NumEntries + 1); struct if_nameindex *out = malloc(memsize); if (out == NULL) { return NULL; } ULONG i = 0; for (i; i < tbl->NumEntries; i++) { MIB_IF_ROW2 r = tbl->Table[i]; WCHAR buf[NDIS_IF_MAX_STRING_SIZE + 1]; if ((ret = ConvertInterfaceLuidToNameW(&r.InterfaceLuid, buf, NDIS_IF_MAX_STRING_SIZE))) { FreeMibTable(tbl); for (ULONG j=0; j<i; j++) { free(out[j].if_name); } free(out); return NULL; } /* convert from wchar_t to char */ size_t origsize = wcslen(buf) + 1; size_t newsize = origsize * 2 + 2; size_t convertedChars = 0; out[i].if_name = malloc(newsize); out[i].if_name[0] = '\\0'; wcstombs_s(&convertedChars, out[i].if_name, newsize, buf, newsize - 1); out[i].if_index = r.InterfaceIndex; } out[i].if_name = NULL; out[i].if_index = 0; return out; } RPY_EXTERN void if_freenameindex(struct if_nameindex *ptr) { if (ptr == NULL) return; int index = 0; while (1) { if (ptr[index].if_name == NULL) break; free(ptr[index].if_name); index += 1; } free(ptr); }""")] compilation_info = eci.merge(ExternalCompilationInfo( includes=includes, separate_module_sources=separate_module_sources, post_include_bits=post_include_bits, )) CConfig.timeval = platform.Struct('struct timeval', [('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)]) fd_set = rffi.COpaquePtr('fd_set', compilation_info=eci) if _WIN32: CConfig.WSAData = platform.Struct('struct WSAData', [('wVersion', rffi.USHORT), ('wHighVersion', rffi.USHORT), ('szDescription', rffi.CFixedArray(lltype.Char, 1)), # (WSADESCRIPTION_LEN+1) ('szSystemStatus', rffi.CFixedArray(lltype.Char, 1)), # (WSASYS_STATUS_LEN+1) ('iMaxSockets', rffi.USHORT), ('iMaxUdpDg', rffi.USHORT), ('lpVendorInfo', CCHARP)]) CConfig.tcp_keepalive = platform.Struct( 'struct tcp_keepalive', [('onoff', rffi.ULONG), ('keepalivetime', rffi.ULONG), ('keepaliveinterval', rffi.ULONG)]) CConfig.GUID = platform.Struct( 'struct _GUID', [('Data1', rffi.UINT), ('Data2', rffi.UINT), ('Data3', rffi.UINT), ('Data4', rffi.CFixedArray(rffi.UCHAR, 8)) ]) CConfig.WSAPROTOCOLCHAIN = platform.Struct( 'struct _WSAPROTOCOLCHAIN', [('ChainLen', rffi.INT), ('ChainEntries', rffi.CFixedArray(rffi.UINT, 7))]) WSAPROTOCOLCHAIN = CConfig.WSAPROTOCOLCHAIN GUID = CConfig.GUID CConfig.WSAPROTOCOL_INFOW = platform.Struct( 'struct _WSAPROTOCOL_INFOW', [('dwServiceFlags1', rffi.UINT), ('dwServiceFlags2', rffi.UINT), ('dwServiceFlags3', rffi.UINT), ('dwServiceFlags4', rffi.UINT), ('dwProviderFlags', rffi.UINT), ('ProviderId', GUID), ('dwCatalogEntryId', rffi.UINT), ('ProtocolChain', WSAPROTOCOLCHAIN), ('iVersion', rffi.INT), ('iAddressFamily', rffi.INT), ('iMaxSockAddr', rffi.INT), ('iMinSockAddr', rffi.INT), ('iSocketType', rffi.INT), ('iProtocol', rffi.INT), ('iProtocolMaxOffset', rffi.INT), ('iNetworkByteOrder', rffi.INT), ('iSecurityScheme', rffi.INT), ('dwMessageSize', rffi.UINT), ('dwProviderReserved', rffi.UINT), ('szProtocol', rffi.CFixedArray(rffi.UCHAR, 256))]) class cConfig: pass > cConfig.__dict__.update(platform.configure(CConfig)) ../rpython/rlib/_rsocket_rffi.py:1222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ CConfig = <class rpython.rlib._rsocket_rffi.CConfig at 0xfffc0e8069f0> ignore_errors = False def configure(CConfig, ignore_errors=False): """Examine the local system by running the C compiler. The CConfig class contains CConfigEntry attribues that describe what should be inspected; configure() returns a dict mapping names to the results. """ for attr in ['_includes_', '_libraries_', '_sources_', '_library_dirs_', '_include_dirs_', '_header_']: assert not hasattr(CConfig, attr), \ "Found legacy attribute %s on CConfig" % attr eci = CConfig._compilation_info_ entries = {} for key in dir(CConfig): value = getattr(CConfig, key) if isinstance(value, CConfigEntry): entries[key] = value res = {} if entries: # can be empty if there are only CConfigSingleEntries results = configure_entries( entries.values(), eci, ignore_errors=ignore_errors) > for name, result in zip(entries, results): ../rpython/rtyper/tool/rffi_platform.py:216: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ entries = [<rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0f0c3050>, <rpython.rtyper.tool.rffi_platfo...er object at 0xfffc0fa24f90>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xfffc0ef834d0>, ...] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def configure_entries(entries, eci, ignore_errors=False): writer = _CWriter(eci) writer.write_header() for i, entry in enumerate(entries): writer.write_entry(str(i), entry) writer.start_main() for i, entry in enumerate(entries): writer.write_entry_main(str(i)) writer.close() infolist = list(run_example_code( > writer.path, eci, ignore_errors=ignore_errors)) ../rpython/rtyper/tool/rffi_platform.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ filepath = local('/tmp/pytest/usession-main-1197/platcheck_145.c') eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def run_example_code(filepath, eci, ignore_errors=False): eci = eci.convert_sources_to_files() files = [filepath] > output = build_executable_cache(files, eci, ignore_errors=ignore_errors) ../rpython/rtyper/tool/rffi_platform.py:745: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ c_files = [local('/tmp/pytest/usession-main-1197/platcheck_145.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> ignore_errors = False def build_executable_cache(c_files, eci, ignore_errors=False): "Builds and run a program; caches the result" # Import 'platform' every time, the compiler may have been changed from rpython.translator.platform import platform path = cache_file_path(c_files, eci, 'build_executable_cache') try: return path.read() except py.error.Error: _previous = platform.log_errors try: if ignore_errors: platform.log_errors = False > result = platform.execute(platform.compile(c_files, eci)) ../rpython/tool/gcc_cache.py:28: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_145.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> outputfilename = None, standalone = True def compile(self, cfiles, eci, outputfilename=None, standalone=True): > ofiles = self._compile_o_files(cfiles, eci, standalone) ../rpython/translator/platform/__init__.py:57: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc> cfiles = [local('/tmp/pytest/usession-main-1197/platcheck_145.c')] eci = <ExternalCompilationInfo (pre_include_bits=(), includes=('sys/types.h', 'sys/s...iles=(), testonly_libraries=(), use_cpp_linker=False, platform=<Linux cc=gcc>)> standalone = True def _compile_o_files(self, cfiles, eci, standalone=True): cfiles = self._all_cfiles(cfiles, eci) compile_args = self._compile_args_from_eci(eci, standalone) ofiles = [] for cfile in cfiles: # Windows hack: use masm for files ending in .asm if str(cfile).lower().endswith('.asm'): ofiles.append(self._compile_c_file(self.masm, cfile, [])) else: > ofiles.append(self._compile_c_file(self.cc, cfile, compile_args)) ../rpython/translator/platform/__init__.py:79: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' cfile = local('/tmp/pytest/usession-main-1197/platcheck_145.c') compile_args = ['-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', '-Wno-address', ...] def _compile_c_file(self, cc, cfile, compile_args): oname = self._make_o_file(cfile, ext='o') args = ['-c'] + compile_args + [str(cfile), '-o', str(oname)] self._execute_c_compiler(cc, args, oname, > cwd=str(cfile.dirpath())) ../rpython/translator/platform/posix.py:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, cc = 'gcc' args = ['-c', '-O3', '-pthread', '-fomit-frame-pointer', '-Wall', '-Wno-unused', ...] outname = local('/tmp/pytest/usession-main-1197/platcheck_145.o') cwd = '/tmp/pytest/usession-main-1197' def _execute_c_compiler(self, cc, args, outname, cwd=None): #log.execute(cc + ' ' + ' '.join(args)) # 'cc' can also contain some options for the C compiler; # e.g. it can be "gcc -m32". We handle it by splitting on ' '. cclist = cc.split() cc = cclist[0] args = cclist[1:] + args returncode, stdout, stderr = _run_subprocess(cc, args, self.c_environ, cwd) > self._handle_error(returncode, stdout, stderr, outname) ../rpython/translator/platform/__init__.py:143: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <Linux cc=gcc>, returncode = 1, stdout = '' stderr = '/tmp/pytest/usession-main-1197/platcheck_145.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/tmp/pytest/us...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/tmp/pytest/usession-main-1197/platcheck_145.o') def _handle_error(self, returncode, stdout, stderr, outname): if returncode != 0: errorfile = outname.new(ext='errors') errorfile.write(stderr, 'wb') if self.log_errors: stderrlines = stderr.splitlines() for line in stderrlines: log.Error(line) # ^^^ don't use ERROR, because it might actually be fine. # Also, ERROR confuses lib-python/conftest.py. > raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /tmp/pytest/usession-main-1197/platcheck_145.c: In function ‘dump_section_447’: E /tmp/pytest/usession-main-1197/platcheck_145.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_145.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /tmp/pytest/usession-main-1197/platcheck_145.c:6939:23: error: invalid application of ‘sizeof’ to incomplete type ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6939 | dump("size", sizeof(platcheck_t)); E | ^~~~~~~~~~~ E In file included from /tmp/pytest/usession-main-1197/platcheck_145.c:143: E /tmp/pytest/usession-main-1197/platcheck_145.c:6940:27: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_145.c:6944:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node)); E | ^~~~~~~~ E /tmp/pytest/usession-main-1197/platcheck_145.c:6948:25: error: invalid use of incomplete typedef ‘platcheck_t’ {aka ‘struct sockaddr_qrtr’} E 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); E | ^~~~~~~~ E """) ../rpython/translator/platform/__init__.py:155: CompilationError ---------------------------- Captured stderr setup ----------------------------- [platform:Error] /tmp/pytest/usession-main-1197/platcheck_145.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_145.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_145.c:6936:14: error: storage size of \u2018s\u2019 isn\u2019t known\n[platform:Error] 6936 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_145.c:6939:23: error: invalid application of \u2018sizeof\u2019 to incomplete type \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6939 | dump("size", sizeof(platcheck_t));\n[platform:Error] | ^~~~~~~~~~~\n[platform:Error] In file included from /tmp/pytest/usession-main-1197/platcheck_145.c:143:\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_145.c:6940:27: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6940 | dump("fldofs sq_family", offsetof(platcheck_t, sq_family));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_145.c:6944:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6944 | dump("fldofs sq_node", offsetof(platcheck_t, sq_node));\n[platform:Error] | ^~~~~~~~\n[platform:Error] /tmp/pytest/usession-main-1197/platcheck_145.c:6948:25: error: invalid use of incomplete typedef \u2018platcheck_t\u2019 {aka \u2018struct sockaddr_qrtr\u2019}\n[platform:Error] 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n[platform:Error] | ^~~~~~~~ ______________ ERROR at setup of AppTestTime.test_clock_monotonic ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /tmp/pytest/usession-main-1197/platcheck_146.c: In functio...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xfffc0f12c6d0>, when = 'setup' def __init__(self, func, when): #: context of invocation: one of "setup", "call", #: "teardown", "memocollect" self.when = when self.start = time() try: > self.result = func() ../_pytest/runner.py:150: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > return CallInfo(lambda: ihook(item=item, **kwds), when=when) ../_pytest/runner.py:138: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_HookCaller 'pytest_runtest_setup'> kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_monotonic'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_clock_monotonic'>} def __call__(self, **kwargs): assert not self.is_historic() > return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs) ../_pytest/vendored_packages/pluggy.py:724: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_pytest.config.PytestPluginManager object at 0xfffc138acf50> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_monotonic'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_clock_monotonic'>} def _hookexec(self, hook, methods, kwargs): # called from all hookcaller instances. # enable_tracing will set its own wrapping function at self._inner_hookexec > return self._inner_hookexec(hook, methods, kwargs) ../_pytest/vendored_packages/pluggy.py:338: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc120ee5a0>, <_pytest.vendored_packages.pluggy.HookImpl in...es.pluggy.HookImpl instance at 0xfffc12e33500>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xfffc12e09690>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_monotonic'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_clock_monotonic'>} self._inner_hookexec = lambda hook, methods, kwargs: \ > _MultiCall(methods, kwargs, hook.spec_opts).execute() ../_pytest/vendored_packages/pluggy.py:333: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_clock_monotonic'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}> def execute(self): all_kwargs = self.kwargs self.results = results = [] firstresult = self.specopts.get("firstresult") while self.hook_impls: hook_impl = self.hook_impls.pop() args = [all_kwargs[argname] for argname in hook_impl.argnames] if hook_impl.hookwrapper: > return _wrapped_call(hook_impl.function(*args), self.execute) ../_pytest/vendored_packages/pluggy.py:595: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ wrap_controller = <generator object pytest_runtest_setup at 0xfffc0edad5a0> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._monotonic'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>> def _wrapped_call(wrap_controller, func): """ Wrap calling to a function with a generator which needs to yield exactly once. The yield point will trigger calling the wrapped function and return its _CallOutcome to the yield point. The generator then needs to finish (raise StopIteration) in order for the wrapped call to complete. """ try: next(wrap_controller) # first yield except StopIteration: _raise_wrapfail(wrap_controller, "did not yield") call_outcome = _CallOutcome(func) try: wrap_controller.send(call_outcome) _raise_wrapfail(wrap_controller, "has sec Output exceeded 6164480 bytes, remaining output has been truncated program finished with exit code 1 elapsedTime=2678.461019