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-x86-32/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=i686 AUDITWHEEL_PLAT=manylinux2014_i686 AUDITWHEEL_POLICY=manylinux2014 DEVTOOLSET_ROOTPATH=/opt/rh/devtoolset-10/root HOME=/home/buildslave HOSTNAME=ffc60fde56a7 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/lib:/opt/rh/devtoolset-10/root/usr/lib/dyninst 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-x86-32/build PYPYCHERRYPICK= PYPY_LOCALBASE=/usr/local PYPY_MAKE_PORTABLE=1 PYTHONPATH=.: SHELL=/bin/bash SHLVL=3 SSL_CERT_FILE=/opt/_internal/certs.pem TERM=xterm TMPDIR=/build_dir/tmp/pytest USER=buildslave _=/usr/bin/linux32 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/_abc/test -- module/_ast/test -- module/_cffi_backend/test -- module/_codecs/test -- module/_collections/test -- module/_continuation/test -- module/_cppyy/test -- module/_csv/test -- module/_demo/test -- module/_hpy_universal/test/_vendored -- module/_hpy_universal/test/pypy -- 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/_opcode/test -- module/_pickle/test -- module/_pickle_support/test -- module/_posixsubprocess/test -- module/_pypyjson/test -- module/_random/test -- module/_rawffi/alt/test -- module/_rawffi/test -- module/_socket/test -- module/_sre/test -- module/_vmprof/test -- module/_warnings/test -- module/_weakref/test -- module/_winreg/test -- module/array/test -- module/atexit/test -- module/binascii/test -- module/bz2/test -- module/cmath/test -- module/cpyext/test/test_api.py -- module/cpyext/test/test_arraymodule.py -- module/cpyext/test/test_async_iter.py -- module/cpyext/test/test_boolobject.py -- module/cpyext/test/test_borrow.py -- module/cpyext/test/test_buffer.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_contextvars.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_exception.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_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_namespaceobject.py -- module/cpyext/test/test_ndarrayobject.py -- module/cpyext/test/test_number.py -- module/cpyext/test/test_object.py -- module/cpyext/test/test_pyerrors.py -- module/cpyext/test/test_pyfile.py -- module/cpyext/test/test_pymem.py -- module/cpyext/test/test_pysignals.py -- module/cpyext/test/test_pystate.py -- module/cpyext/test/test_pystrhex.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/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/token/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/fake_pytest/test -- tool/pytest/test -- tool/release/test -- tool/test -- total: 143 to run ++ 00:31:01 starting config/test [1 started in total] ++ 00:31:01 starting interpreter/astcompiler/test [2 started in total] ++ 00:31:01 starting interpreter/pyparser/test [3 started in total] ++ 00:31:01 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-x86-32/build/pypy/.hypothesis/examples') pytest-2.9.2 from /build_dir/own-linux-x86-32/build/pytest.py rootdir: /build_dir/own-linux-x86-32/build, inifile: pytest.ini plugins: hypothesis-4.39.3 collected 161 items / 1 skipped config/test/test_pypyoption.py ................................................................................................................................................................. ==================== 161 passed, 1 skipped in 14.25 seconds ==================== ++ 00:31:19 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-x86-32/build/pypy/.hypothesis/examples') pytest-2.9.2 from /build_dir/own-linux-x86-32/build/pytest.pyc rootdir: /build_dir/own-linux-x86-32/build, inifile: pytest.ini plugins: hypothesis-4.39.3 collected 186 items / 1 errors interpreter/pyparser/test/test_automata.py ... interpreter/pyparser/test/test_future.py ................................... interpreter/pyparser/test/test_gendfa.py . interpreter/pyparser/test/test_parsestring.py EEEEEEEEEEEE interpreter/pyparser/test/test_pyparse.py EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE interpreter/pyparser/test/test_pytokenizer.py EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ==================================== ERRORS ==================================== ____ ERROR collecting pypy/interpreter/pyparser/test/apptest_parsestring.py ____ tool/pytest/apptest2.py:25: in collect space = objspace.gettestobjspace(**spaceconfig) tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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) ../rpython/translator/platform/__init__.py:155: in _handle_error raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_87.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_87.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_87.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_87.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 """) ------------------------------- Captured stderr -------------------------------- [platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_87.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_87.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_simple _________________ item = <Function 'test_simple'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_88.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_88.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_88.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_88.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_88.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_88.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_88.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_unicode _________________ item = <Function 'test_unicode'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_89.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_89.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_89.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_89.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_89.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_89.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_89.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_unicode_pep414 _____________ item = <Function 'test_unicode_pep414'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_90.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_90.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_90.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_90.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_90.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_90.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_90.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_unicode_literals ____________ item = <Function 'test_unicode_literals'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_91.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_91.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_91.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_91.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_91.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_91.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_91.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_raw_unicode_literals __________ item = <Function 'test_raw_unicode_literals'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_92.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_92.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_92.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_92.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_92.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_92.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_92.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_bytes __________________ item = <Function 'test_bytes'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_93.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_93.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_93.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_93.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_93.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_93.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_93.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_simple_enc_roundtrip __________ item = <Function 'test_simple_enc_roundtrip'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_94.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_94.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_94.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_94.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_94.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_94.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_94.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_95.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_95.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_95.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_95.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_95.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_95.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_95.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_bug1 __________________ item = <Function 'test_bug1'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_96.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_96.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_96.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_96.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_96.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_96.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_96.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_97.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_97.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_97.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_97.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_97.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_97.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_97.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestParsetring.test_decode_unicode_utf8 ___________ item = <Function 'test_decode_unicode_utf8'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_98.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_98.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_98.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_98.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_98.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_98.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_98.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_parsestr_segfault ____________ item = <Function 'test_parsestr_segfault'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_99.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_99.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_99.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_99.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_99.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_99.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_99.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_encoding _______________ item = <Function 'test_encoding'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_100.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_100.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_100.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_100.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_100.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_100.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_100.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_with_and_as ______________ item = <Function 'test_with_and_as'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_101.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_101.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_101.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_101.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_101.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_101.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_101.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_dont_imply_dedent ___________ item = <Function 'test_dont_imply_dedent'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_102.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_102.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_102.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_102.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_102.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_102.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_102.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_encoding_pep3120 ___________ item = <Function 'test_encoding_pep3120'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_103.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_103.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_103.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_103.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_103.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_103.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_103.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_unicode_identifier __________ item = <Function 'test_unicode_identifier'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_104.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_104.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_104.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_104.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_104.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_104.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_104.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_syntax_error _____________ item = <Function 'test_syntax_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_105.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_105.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_105.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_105.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_105.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_105.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_105.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_is __________________ item = <Function 'test_is'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_106.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_106.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_106.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_106.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_106.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_106.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_106.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_indentation_error ___________ item = <Function 'test_indentation_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_107.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_107.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_107.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_107.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_107.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_107.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_107.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_taberror _______________ item = <Function 'test_taberror'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_108.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_108.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_108.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_108.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_108.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_108.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_108.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_mac_newline ______________ item = <Function 'test_mac_newline'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_109.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_109.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_109.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_109.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_109.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_109.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_109.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_multiline_string ___________ item = <Function 'test_multiline_string'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_110.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_110.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_110.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_110.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_110.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_110.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_110.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_bytes_literal _____________ item = <Function 'test_bytes_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_111.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_111.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_111.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_111.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_111.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_111.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_111.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_new_octal_literal ___________ item = <Function 'test_new_octal_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_112.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_112.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_112.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_112.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_112.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_112.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_112.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_new_binary_literal __________ item = <Function 'test_new_binary_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_113.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_113.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_113.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_113.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_113.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_113.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_113.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_print_function ____________ item = <Function 'test_print_function'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_114.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_114.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_114.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_114.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_114.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_114.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_114.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_revdb_dollar_num ___________ item = <Function 'test_revdb_dollar_num'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_115.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_115.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_115.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_115.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_115.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_115.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_115.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_py3k_reject_old_binary_literal ____ item = <Function 'test_py3k_reject_old_binary_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_116.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_116.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_116.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_116.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_116.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_116.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_116.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_py3k_extended_unpacking ________ item = <Function 'test_py3k_extended_unpacking'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_117.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_117.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_117.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_117.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_117.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_117.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_117.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_u_triple_quote ____________ item = <Function 'test_u_triple_quote'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_118.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_118.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_118.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_118.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_118.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_118.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_118.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_bad_single_statement _________ item = <Function 'test_bad_single_statement'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_119.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_119.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_119.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_119.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_119.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_119.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_119.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_null_bytes_rejected __________ item = <Function 'test_null_bytes_rejected'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_120.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_120.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_120.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_120.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_120.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_120.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_120.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_unpack ________________ item = <Function 'test_unpack'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_121.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_121.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_121.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_121.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_121.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_121.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_121.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_async_await ______________ item = <Function 'test_async_await'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_122.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_122.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_122.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_122.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_122.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_122.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_122.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_async_await_hacks ___________ item = <Function 'test_async_await_hacks'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_123.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_123.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_123.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_123.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_123.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_123.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_123.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_number_underscores __________ item = <Function 'test_number_underscores'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_124.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_124.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_124.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_124.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_124.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_124.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_124.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_relaxed_decorators __________ item = <Function 'test_relaxed_decorators'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_125.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_125.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_125.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_125.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_125.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_125.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_125.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_universal_newlines __________ item = <Function 'test_universal_newlines'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_126.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_126.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_126.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_126.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_126.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_126.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_126.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_error_forgotten_chars _________ item = <Function 'test_error_forgotten_chars'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_127.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_127.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_127.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_127.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_127.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_127.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_127.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_positional_only_args _________ item = <Function 'test_positional_only_args'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_128.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_128.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_128.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_128.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_128.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_128.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_128.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_forgot_comma_wrong __________ item = <Function 'test_forgot_comma_wrong'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_129.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_129.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_129.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_129.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_129.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_129.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_129.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_error_print_without_parens ______ item = <Function 'test_error_print_without_parens'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_130.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_130.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_130.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_130.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_130.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_130.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_130.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_end_location_unparenthized_genexp ___ item = <Function 'test_end_location_unparenthized_genexp'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_131.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_131.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_131.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_131.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_131.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_131.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_131.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_invalid_default ____________ item = <Function 'test_invalid_default'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_132.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_132.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_132.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_132.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_132.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_132.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_132.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_invalid_star _____________ item = <Function 'test_invalid_star'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_133.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_133.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_133.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_133.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_133.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_133.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_133.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_null_bytes_in_source _________ item = <Function 'test_null_bytes_in_source'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_134.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_134.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_134.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_134.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_134.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_134.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_134.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_null_bytes_in_comment _________ item = <Function 'test_null_bytes_in_comment'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_135.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_135.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_135.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_135.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_135.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_135.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_135.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_null_bytes_lineno_and_text ______ item = <Function 'test_null_bytes_lineno_and_text'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_136.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_136.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_136.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_136.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_136.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_136.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_136.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParser.test_null_bytes_multiline_lineno_and_text _ item = <Function 'test_null_bytes_multiline_lineno_and_text'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_137.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_137.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_137.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_137.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_137.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_137.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_137.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_encoding _____________ item = <Function 'test_encoding'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_138.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_138.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_138.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_138.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_138.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_138.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_138.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_with_and_as ___________ item = <Function 'test_with_and_as'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_139.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_139.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_139.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_139.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_139.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_139.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_139.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_dont_imply_dedent ________ item = <Function 'test_dont_imply_dedent'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_140.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_140.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_140.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_140.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_140.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_140.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_140.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_encoding_pep3120 _________ item = <Function 'test_encoding_pep3120'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_141.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_141.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_141.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_141.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_141.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_141.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_141.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_unicode_identifier ________ item = <Function 'test_unicode_identifier'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_142.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_142.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_142.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_142.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_142.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_142.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_142.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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_syntax_error ___________ item = <Function 'test_syntax_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_143.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_143.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_143.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_143.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_143.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_143.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_143.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParserRevDB.test_is ________________ item = <Function 'test_is'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_144.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_144.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_144.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_144.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_144.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_144.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_144.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParserRevDB.test_indentation_error ________ item = <Function 'test_indentation_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_145.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_145.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_145.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_145.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_145.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_145.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_145.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParserRevDB.test_taberror _____________ item = <Function 'test_taberror'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_146.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_146.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_146.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_146.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_146.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_146.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_146.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParserRevDB.test_mac_newline ___________ item = <Function 'test_mac_newline'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_147.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_147.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_147.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_147.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_147.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_147.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_147.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 TestPythonParserRevDB.test_multiline_string _________ item = <Function 'test_multiline_string'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_148.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_148.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_148.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_148.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_148.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_148.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_148.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] /build_dir/tmp/pytest/usession-py3.11-779/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] | ^~~~~~~~ __________ 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_149.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_150.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_151.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_152.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_py3k_reject_old_binary_literal __ item = <Function 'test_py3k_reject_old_binary_literal'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_153.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_py3k_extended_unpacking _____ item = <Function 'test_py3k_extended_unpacking'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_154.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_u_triple_quote __________ item = <Function 'test_u_triple_quote'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_155.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_bad_single_statement _______ item = <Function 'test_bad_single_statement'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_156.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_null_bytes_rejected _______ item = <Function 'test_null_bytes_rejected'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_157.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_unpack ______________ item = <Function 'test_unpack'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_158.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_async_await ___________ item = <Function 'test_async_await'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_159.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_async_await_hacks ________ item = <Function 'test_async_await_hacks'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_160.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_number_underscores ________ item = <Function 'test_number_underscores'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_161.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_relaxed_decorators ________ item = <Function 'test_relaxed_decorators'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_162.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_163.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_164.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_positional_only_args _______ item = <Function 'test_positional_only_args'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_165.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_forgot_comma_wrong ________ item = <Function 'test_forgot_comma_wrong'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_166.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_print_without_parens ____ item = <Function 'test_error_print_without_parens'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_167.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_end_location_unparenthized_genexp item = <Function 'test_end_location_unparenthized_genexp'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_168.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_invalid_default _________ item = <Function 'test_invalid_default'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_169.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_invalid_star ___________ item = <Function 'test_invalid_star'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_170.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_null_bytes_in_source _______ item = <Function 'test_null_bytes_in_source'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_171.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_null_bytes_in_comment ______ item = <Function 'test_null_bytes_in_comment'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_172.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_null_bytes_lineno_and_text ____ item = <Function 'test_null_bytes_lineno_and_text'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_173.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_null_bytes_multiline_lineno_and_text item = <Function 'test_null_bytes_multiline_lineno_and_text'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_174.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_175.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 TestPythonPegParser.test_crash_with _____________ item = <Function 'test_crash_with'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_176.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 TestPythonPegParser.test_crash_eval_empty __________ item = <Function 'test_crash_eval_empty'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_177.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 TestPythonPegParser.test_dont_imply_dedent_ignored_on_exec _ item = <Function 'test_dont_imply_dedent_ignored_on_exec'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_178.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 TestPythonPegParser.test_pattern_matching_experiment ____ item = <Function 'test_pattern_matching_experiment'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_179.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 TestPythonPegParser.test_nonparen_genexp_in_call ______ item = <Function 'test_nonparen_genexp_in_call'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_180.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 TestPythonPegParser.test_end_positions ___________ item = <Function 'test_end_positions'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_181.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 TestPythonPegParser.test_match_deeply_nested ________ item = <Function 'test_match_deeply_nested'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_182.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 TestPythonPegParser.test_except_star ____________ item = <Function 'test_except_star'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_183.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 TestPythonPegParser.test_dict_with_equals_suggests_colon __ item = <Function 'test_dict_with_equals_suggests_colon'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_184.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 TestPythonPegParser.test_except_star_no_type_offset _____ item = <Function 'test_except_star_no_type_offset'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_185.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 TestIncompleteInput.test_simple _______________ item = <Function 'test_simple'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_186.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 TestIncompleteInput.test_expression _____________ item = <Function 'test_expression'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_187.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 TestIncompleteInput.test_if _________________ item = <Function 'test_if'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_188.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 TestIncompleteInput.test_nested _______________ item = <Function 'test_nested'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_189.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 TestIncompleteInput.test_real_error _____________ item = <Function 'test_real_error'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_190.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 TestIncompleteInput.test_triplequote ____________ item = <Function 'test_triplequote'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_191.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 TestIncompleteInput.test_augmented_assignment ________ item = <Function 'test_augmented_assignment'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_192.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 TestIncompleteInput.test_parenthesized ___________ item = <Function 'test_parenthesized'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_193.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 TestIncompleteInput.test_ifelse _______________ item = <Function 'test_ifelse'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_194.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 TestIncompleteInput.test_line_continuation _________ item = <Function 'test_line_continuation'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_195.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 TestIncompleteInput.test_unterminated_single_quote_with_newline_is_invalid item = <Function 'test_unterminated_single_quote_with_newline_is_invalid'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_196.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 TestIncompleteInput.test_unterminated_single_quote_no_newline_is_invalid item = <Function 'test_unterminated_single_quote_no_newline_is_invalid'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_197.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 TestIncompleteInput.test_invalid_with_explicit_newline ___ item = <Function 'test_invalid_with_explicit_newline'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_198.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 TestIncompleteInput.test_if_with_explicit_newline ______ item = <Function 'test_if_with_explicit_newline'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_199.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 TestIncompleteInput.test_def_blank_line_unindented_body_is_invalid item = <Function 'test_def_blank_line_unindented_body_is_invalid'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_200.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 TestIncompleteInput.test_eval_mode_empty_is_incomplete ___ item = <Function 'test_eval_mode_empty_is_incomplete'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_201.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 TestIncompleteInput.test_eval_mode_trailing_operator_is_invalid item = <Function 'test_eval_mode_trailing_operator_is_invalid'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_202.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 TestIncompleteInput.test_eval_mode_open_paren_with_newline_is_incomplete item = <Function 'test_eval_mode_open_paren_with_newline_is_incomplete'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_203.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 TestIncompleteInput.test_decorator_without_body_is_incomplete item = <Function 'test_decorator_without_body_is_incomplete'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_204.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_205.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_206.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_207.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_208.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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_209.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_type_comments ______________ item = <Function 'test_type_comments'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_210.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_type_comment_bug _____________ item = <Function 'test_type_comment_bug'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_211.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_type_ignore _______________ item = <Function 'test_type_ignore'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_212.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_walrus __________________ item = <Function 'test_walrus'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_213.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_triple_quoted ______________ item = <Function 'test_triple_quoted'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_214.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_parenthesis_positions __________ item = <Function 'test_parenthesis_positions'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_215.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_PyCF_DONT_IMPLY_DEDENT __________ item = <Function 'test_PyCF_DONT_IMPLY_DEDENT'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_216.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_ignore_just_linecont ___________ item = <Function 'test_ignore_just_linecont'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_217.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_linecont ______________ item = <Function 'test_error_linecont'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_218.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_continuation_and_indentation_levels ___ item = <Function 'test_continuation_and_indentation_levels'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_219.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_formfeed1 ________________ item = <Function 'test_formfeed1'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_220.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_formfeed2 ________________ item = <Function 'test_formfeed2'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_221.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_backslash_before_indent1 _________ item = <Function 'test_backslash_before_indent1'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_222.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_backslash_before_indent2 _________ item = <Function 'test_backslash_before_indent2'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_223.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_integers ______________ item = <Function 'test_error_integers'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_224.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_invalid_identifier ____________ item = <Function 'test_invalid_identifier'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_225.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 TestTokenizer310Changes.test_single_quoted _________ item = <Function 'test_single_quoted'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_226.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 TestTokenizer310Changes.test_triple_quoted _________ item = <Function 'test_triple_quoted'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_227.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 TestTokenizer310Changes.test_single_quoted_detected _____ item = <Function 'test_single_quoted_detected'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_228.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 TestTokenizer310Changes.test_triple_quoted_detected _____ item = <Function 'test_triple_quoted_detected'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_229.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 TestTokenizer310Changes.test_warn_number_followed_by_keyword item = <Function 'test_warn_number_followed_by_keyword'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_230.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 TestTokenizer310Changes.test_error_number_by_non_keyword_name item = <Function 'test_error_number_by_non_keyword_name'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_231.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 TestTokenizer310Changes.test_levels _____________ item = <Function 'test_levels'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_232.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 TestTokenizer310Changes.test_non_utf8_error_message _____ item = <Function 'test_non_utf8_error_message'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_233.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 TestTokenizer310Changes.test_invalid_float_exponent _____ item = <Function 'test_invalid_float_exponent'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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 = '/build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c:143: E /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c:6933:18: error: field \u2018s\u2019 has incomplete type\n[platform:Error] 6933 | platcheck_t s;\n[platform:Error] | ^\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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 /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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] /build_dir/tmp/pytest/usession-py3.11-779/platcheck_234.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] | ^~~~~~~~ ==================== 39 passed, 148 error in 656.24 seconds ==================== ++ 00:42:05 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-x86-32/build/pypy/.hypothesis/examples') pytest-2.9.2 from /build_dir/own-linux-x86-32/build/pytest.pyc rootdir: /build_dir/own-linux-x86-32/build, inifile: pytest.ini plugins: hypothesis-4.39.3 collected 73 items / 1 errors module/__pypy__/test/test_builders.py EEEEE module/__pypy__/test/test_bytebuffer.py EEE 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 EEEEEEEEEE module/__pypy__/test/test_newmemoryview.py EEEEEE module/__pypy__/test/test_os.py E module/__pypy__/test/test_signal.py EEEEE module/__pypy__/test/test_special.py EEEEEEEEEEEEEE ==================================== ERRORS ==================================== ______ ERROR collecting pypy/module/__pypy__/test/apptest_picklebuffer.py ______ tool/pytest/apptest2.py:25: in collect space = objspace.gettestobjspace(**spaceconfig) tool/pytest/objspace.py:24: in gettestobjspace space = maketestobjspace(config) tool/pytest/objspace.py:34: in maketestobjspace space = make_objspace(config) tool/option.py:33: in make_objspace return StdObjSpace(config) interpreter/baseobjspace.py:455: in __init__ self.initialize() objspace/std/objspace.py:115: in initialize self.make_builtins() interpreter/baseobjspace.py:634: in make_builtins mod = Module(self, w_name) module/imp/moduledef.py:44: 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 rpython.rlib import streamio, jit ../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) ../rpython/translator/platform/__init__.py:155: in _handle_error raise CompilationError(stdout, stderr) E CompilationError: CompilationError(err=""" E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_87.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_87.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_87.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_87.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 """) ------------------------------- Captured stderr -------------------------------- [platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_87.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_87.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestBuilders.test_simple _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4741d14>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf473848c> 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 0xf4ab44cc> 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 0xf4ab44cc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf460da0c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf460da0c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf460da0c> 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 0xf460da0c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4930a2c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf494456c> 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 0xf46cd8ec>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf46cd3ec>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf46d466c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_88.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestBuilders.test_preallocate ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf47b05dc>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf43e8054> 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 0xf499d20c> 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 0xf499d20c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf499d14c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf499d14c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf499d14c> 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 0xf499d14c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf45b2f0c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4a2256c> 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 0xf4450d0c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf445080c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf446988c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_89.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestBuilders.test_append_slice ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4697614>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4a103ec> 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 0xf465626c> 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 0xf465626c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf46562ac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf46562ac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf46562ac> 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 0xf46562ac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf46d452c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4948b3c> 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 0xf46db66c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf46db30c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf49c58ec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_90.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestBuilders.test_module_attribute ____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf438525c>, 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_module_attribute'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_module_attribute'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_module_attribute'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_module_attribute'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_module_attribute'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_module_attribute'>} 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_module_attribute'>, '__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 0xf4775054> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._attribute'>, '__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 0xf49a890c> 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 0xf49a890c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._attribute'>, '__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_module_attribute'>, '__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_module_attribute'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf49a894c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf49a894c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf49a894c> 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 0xf49a894c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43fc5cc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf49b3ddc> 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 0xf49ab22c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf4999d0c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf49abd6c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_91.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestBuilders.test_stringbuilder _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf481502c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4b960cc> 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 0xf4656aac> 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 0xf4656aac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf46560ac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf46560ac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf46560ac> 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 0xf46560ac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4a8ce6c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4aa971c> 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 0xf498e7ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf498ed6c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf43f058c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_92.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTest.test_bytebuffer ___________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf498a144>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf484dc0c> 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 0xf4281acc> 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 0xf4281acc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf428174c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf428174c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf428174c> 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 0xf428174c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4380aac> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf490cd1c> 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 0xf4926dcc>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf492604c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf44d678c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_93.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTest.test_buffer_getslice_empty _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf42a71ec>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf423702c> 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 0xf44fb32c> 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 0xf44fb32c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf44fb36c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf44fb36c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf44fb36c> 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 0xf44fb36c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf477b8cc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4a94fbc> 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 0xf4532c2c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf453274c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf425420c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_94.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTest.test_bytebuffer_object _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4741e9c>, 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_object'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bytebuffer_object'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bytebuffer_object'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bytebuffer_object'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_bytebuffer_object'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_bytebuffer_object'>} 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_object'>, '__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 0xf499f5a4> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...fer_object'>, '__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 0xf4ac082c> 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 0xf4ac082c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...fer_object'>, '__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_object'>, '__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_object'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf4ac046c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4ac046c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4ac046c> 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 0xf4ac046c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4380f0c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf448989c> 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 0xf452f1cc>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf452f08c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf492612c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_95.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestDebug.test_debug_print ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4ac3144>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf470afa4> 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 0xf4a2444c> 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 0xf4a2444c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf4a249ac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4a249ac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4a249ac> 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 0xf4a249ac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf48f78ec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4928ecc> 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 0xf49dd1cc>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf49dd96c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf42d8b0c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_96.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestDebug.test_debug_print_once _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf430e10c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf430f054> 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 0xf426856c> 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 0xf426856c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf426882c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf426882c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf426882c> 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 0xf426882c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf45bb1ac> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4aae1ac> 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 0xf49406ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf485d50c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf482162c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_97.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestDebug.test_debug_flush ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4a17764>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf46ebe3c> 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 0xf42fa6cc> 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 0xf42fa6cc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf42fa70c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42fa70c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42fa70c> 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 0xf42fa70c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf482f86c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf470ebcc> 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 0xf425462c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf425480c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf47c8a0c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_98.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestDebug.test_debug_read_timestamp ___________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c: ...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4aa2d84>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf492f194> 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 0xf4692eac> 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 0xf4692eac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf4532b8c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4532b8c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4532b8c> 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 0xf4532b8c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4940d4c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf490c41c> 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 0xf4310aac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf42d8dac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf49dd3cc>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bui...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_99.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestDebug.test_debug_get_timestamp_unit _________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf46d8e2c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf494a464> 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 0xf4aaa32c> 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 0xf4aaa32c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf4aaae4c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4aaae4c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4aaae4c> 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 0xf4aaae4c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43740ec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf447835c> 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 0xf429324c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf429346c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf41f57ac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_100.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestDebug.test_debug_start_stop_timestamp ________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf49342cc>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf430f07c> 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 0xf48ce82c> 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 0xf48ce82c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf48ce7ec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf48ce7ec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf48ce7ec> 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 0xf48ce7ec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf48a4bec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4aae6ec> 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 0xf4474e8c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf464c8ec>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf46a112c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_101.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestDebug.test_remote_exec_exists ____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf46f76bc>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4a38f2c> 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 0xf4538e0c> 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 0xf4538e0c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf4538d0c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4538d0c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4538d0c> 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 0xf4538d0c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf437146c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf458cefc> 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 0xf424f06c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf424f66c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf485d9ac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_102.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIdentityDict.test_numbers ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4a0c374>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf472075c> 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 0xf477b2ac> 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 0xf477b2ac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf477bf0c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf477bf0c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf477bf0c> 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 0xf477bf0c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf47c806c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf49a40ec> 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 0xf45098ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf4509f6c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf44f374c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_103.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIdentityDict.test_get ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf45a902c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4a44784> 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 0xf48f83ac> 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 0xf48f83ac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf48f834c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf48f834c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf48f834c> 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 0xf48f834c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf459908c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf470eaac> 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 0xf42c1e4c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf42c11ac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf49a860c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_104.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIdentityDict.test_unhashable _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf45c6f0c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf46c5a54> 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 0xf43364cc> 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 0xf43364cc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf43367ec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43367ec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43367ec> 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 0xf43367ec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf48d636c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf48d811c> 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 0xf48b260c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf48b222c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf45dc02c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_105.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIdentityDict.test_keys ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf44ad33c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4a10324> 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 0xf4773a0c> 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 0xf4773a0c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf47739ac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf47739ac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf47739ac> 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 0xf47739ac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf42649ac> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4a359ec> 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 0xf48f718c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf48f780c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf49d8aac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_106.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIdentityDict.test_in _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf499a79c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf494adc4> 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 0xf45dc20c> 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 0xf45dc20c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf45dc6cc> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45dc6cc> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45dc6cc> 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 0xf45dc6cc> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf424f48c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4a09e6c> 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 0xf44d29cc>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf44d2cac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf47a848c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_107.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIdentityDict.test_iterate ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf46acb1c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4941aa4> 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 0xf43c5f8c> 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 0xf43c5f8c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf43c5cec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43c5cec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43c5cec> 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 0xf43c5cec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf409dbec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf494f35c> 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 0xf465606c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf47bc54c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf46226ac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_108.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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_intmask __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4a43144>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf48d707c> 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 0xf40ffcec> 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 0xf40ffcec> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf40ffdcc> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf40ffdcc> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf40ffdcc> 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 0xf40ffdcc> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4a24e0c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4a22efc> 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 0xf46c0acc>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf478032c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf46c01ac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_109.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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_int_add __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf460aa74>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf465220c> 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 0xf43163ac> 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 0xf43163ac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf43163ec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43163ec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43163ec> 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 0xf43163ec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf45dc4ac> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf494483c> 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 0xf41afcec>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf41af8cc>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf4ac038c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_110.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_int_sub __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf42eb8ec>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4747e14> 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 0xf45f012c> 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 0xf45f012c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf45f0cec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45f0cec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45f0cec> 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 0xf45f0cec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf425450c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf44ac59c> 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 0xf43910ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf439140c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf444244c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_111.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_int_mul __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf409a374>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf44c6f04> 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 0xf409dfac> 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 0xf409dfac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf409dc6c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf409dc6c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf409dc6c> 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 0xf409dc6c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4675b4c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf46db0ec> 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 0xf4a075ec>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf4a071ec>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf4a61d8c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_112.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_int_floordiv _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf443fcdc>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4978234> 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 0xf45c24ec> 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 0xf45c24ec> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf45c24cc> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45c24cc> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45c24cc> 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 0xf45c24cc> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43d218c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf424e1ac> 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 0xf4aaaeec>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf468f26c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf42317ac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_113.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_int_mod __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf42eb8ec>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4488c84> 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 0xf40b4dac> 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 0xf40b4dac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf40b4e6c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf40b4e6c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf40b4e6c> 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 0xf40b4e6c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf413c26c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf49a580c> 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 0xf44c35ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf45b256c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf44c33ac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_114.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_int_lshift ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf429c8b4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf43554b4> 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 0xf449a54c> 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 0xf449a54c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf449a6ac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf449a6ac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf449a6ac> 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 0xf449a6ac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf463f14c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf494cd7c> 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 0xf48f830c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf42c1dcc>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf48ce48c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_115.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_int_rshift ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4893ca4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4912b44> 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 0xf4940d6c> 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 0xf4940d6c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf4940ccc> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4940ccc> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4940ccc> 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 0xf4940ccc> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4a2a64c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf458ca4c> 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 0xf482f34c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf451352c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf46ff96c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_116.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_uint_rshift ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf429c844>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4972644> 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 0xf412e8cc> 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 0xf412e8cc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf412e92c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf412e92c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf412e92c> 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 0xf412e92c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf485d34c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf493108c> 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 0xf45e310c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf45e36cc>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf4694e0c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_117.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_mulmod __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf454c6f4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4260d4c> 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 0xf432994c> 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 0xf432994c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf432992c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf432992c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf432992c> 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 0xf432992c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43a9e4c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf49d3f5c> 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 0xf4414e0c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf441484c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf42813ec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_118.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestIntOp.test_invalid __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf449c924>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf49fadec> 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 0xf417ba0c> 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 0xf417ba0c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf417bd0c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf417bd0c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf417bd0c> 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 0xf417bd0c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf407308c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf46f5bcc> 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 0xf43f7bcc>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf43f724c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf3fe6dec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_119.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestLocals2Fast.test_set_locals_using_save_locals ____ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf44171b4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4843d74> 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 0xf437d26c> 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 0xf437d26c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {}, config = <rpython.config.config.Config object at 0xf437db4c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf437db4c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf437db4c> 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 0xf437db4c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf3fd5aec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4954dac> 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 0xf44a652c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf44a6e4c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf40de56c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_120.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestLocals2Fast.test_frame_simple_change _________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf41df534>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4652f7c> 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 0xf47ee04c> 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 0xf47ee04c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {}, config = <rpython.config.config.Config object at 0xf47ee62c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf47ee62c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf47ee62c> 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 0xf47ee62c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf460740c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf43d317c> 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 0xf4838e4c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf483898c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf433f18c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_121.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestLocals2Fast.test_frame_co_freevars __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4a4302c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4837324> 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 0xf42f066c> 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 0xf42f066c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {}, config = <rpython.config.config.Config object at 0xf42f04cc> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42f04cc> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42f04cc> 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 0xf42f04cc> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43698ac> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf49e8f8c> 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 0xf3f613cc>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3f6194c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf44b6a4c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_122.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestLocals2Fast.test_frame_co_cellvars __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf47a733c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4363dc4> 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 0xf4776ccc> 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 0xf4776ccc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {}, config = <rpython.config.config.Config object at 0xf4776c8c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4776c8c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4776c8c> 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 0xf4776c8c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf428dc4c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4855d1c> 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 0xf407668c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf40788ec>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf4076e4c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_123.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestLocals2Fast.test_frame_change_in_inner_frame _____ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf43d0c34>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4a4498c> 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 0xf437d98c> 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 0xf437d98c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {}, config = <rpython.config.config.Config object at 0xf437d80c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf437d80c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf437d80c> 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 0xf437d80c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf486238c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf46b69ec> 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 0xf450ae0c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf450acec>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf433fbec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_124.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_new_code_hook _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf443d17c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf48373ec> 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 0xf42270ec> 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 0xf42270ec> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf422798c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf422798c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf422798c> 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 0xf422798c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf45458cc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4954f2c> 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 0xf442092c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf4420a0c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf47a2dac>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_125.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_decode_long ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3f4d25c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf44880cc> 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 0xf413c4ac> 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 0xf413c4ac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf413ce0c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf413ce0c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf413ce0c> 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 0xf413ce0c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf42326ec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4684ecc> 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 0xf4078cac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf407802c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf4076fec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_126.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_promote __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4a4325c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf456c07c> 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 0xf4391d4c> 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 0xf4391d4c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf43917ac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43917ac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43917ac> 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 0xf43917ac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf406f84c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4866aac> 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 0xf3f6c22c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3f6c1ac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf3fcd36c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_127.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_set_exc_info _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf41ad1ec>, 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_exc_info'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_exc_info'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_exc_info'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info'>} 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_exc_info'>, '__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 0xf4747b94> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_exc_info'>, '__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 0xf3f1e28c> 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 0xf3f1e28c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...t_exc_info'>, '__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_exc_info'>, '__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_exc_info'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf3f1e10c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3f1e10c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3f1e10c> 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 0xf3f1e10c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf467688c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4948a1c> 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 0xf3eeef0c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3eee90c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf42ff90c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_128.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_set_exc_info_issue3096 __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4198064>, 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_exc_info_issue3096'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info_issue3096'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_exc_info_issue3096'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info_issue3096'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_exc_info_issue3096'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info_issue3096'>} 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_exc_info_issue3096'>, '__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 0xf470a054> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._issue3096'>, '__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 0xf42ed08c> 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 0xf42ed08c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._issue3096'>, '__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_exc_info_issue3096'>, '__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_exc_info_issue3096'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf42ed90c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42ed90c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42ed90c> 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 0xf42ed90c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf483894c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf48af0ec> 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 0xf4499fec>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf4879bac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf44a64ec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_129.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_set_exc_info_traceback __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf47857d4>, 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_exc_info_traceback'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info_traceback'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_exc_info_traceback'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info_traceback'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_set_exc_info_traceback'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_set_exc_info_traceback'>} 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_exc_info_traceback'>, '__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 0xf492fedc> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._traceback'>, '__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 0xf43f676c> 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 0xf43f676c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._traceback'>, '__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_exc_info_traceback'>, '__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_exc_info_traceback'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf43f6bec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43f6bec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43f6bec> 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 0xf43f6bec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf423524c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf426174c> 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 0xf420bbac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf420b46c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf45991ec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_130.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_utf8_content _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3e3e064>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf46ebe3c> 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 0xf438010c> 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 0xf438010c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf43807ec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43807ec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43807ec> 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 0xf43807ec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf42988cc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf435bfbc> 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 0xf42739ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf4273e6c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf3fb9c0c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_131.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_get_osfhandle _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf429b6bc>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf42e37fc> 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 0xf441b12c> 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 0xf441b12c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf441b9ec> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf441b9ec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf441b9ec> 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 0xf441b9ec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf41c870c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf44f229c> 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 0xf40abd6c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf40ab6cc>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf3fb704c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_132.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_get_set_contextvar_context ________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4896144>, 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_set_contextvar_context'>, '...lticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_set_contextvar_context'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_set_contextvar_context'>, '...lticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_set_contextvar_context'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_get_set_contextvar_context'>, '...lticall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_get_set_contextvar_context'>} 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_set_contextvar_context'>, '__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 0xf4504cfc> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ar_context'>, '__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 0xf3e9276c> 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 0xf3e9276c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...ar_context'>, '__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_set_contextvar_context'>, '__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_set_contextvar_context'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf3e9286c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3e9286c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3e9286c> 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 0xf3e9286c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43e64cc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4ab192c> 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 0xf3f61a4c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3f616ac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf4a611cc>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_133.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMagic.test_list_get_physical_size __________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4039bc4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4ac5694> 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 0xf43ffe8c> 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 0xf43ffe8c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf43ff34c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43ff34c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf43ff34c> 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 0xf43ff34c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43a9ccc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf45ede3c> 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 0xf465558c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf465502c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf499864c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_134.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMinimal.test_newmemoryview ______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3d80ae4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf495798c> 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 0xf3dfb34c> 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 0xf3dfb34c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf3dfbb4c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3dfbb4c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3dfbb4c> 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 0xf3dfbb4c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4676dec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf48fcecc> 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 0xf40abdac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf40abb8c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf449f38c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_135.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMinimal.test_empty __________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf46233ac>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf47750a4> 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 0xf46018ec> 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 0xf46018ec> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf4601aac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4601aac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf4601aac> 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 0xf4601aac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf42f620c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf48c323c> 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 0xf3cc07ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3cc034c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf408944c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_136.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMinimal.test_strided1d ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf45e1fb4>, 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_strided1d'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_strided1d'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_strided1d'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_strided1d'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_strided1d'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_strided1d'>} 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_strided1d'>, '__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 0xf49722ac> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._strided1d'>, '__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 0xf49a9cac> 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 0xf49a9cac> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._strided1d'>, '__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_strided1d'>, '__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_strided1d'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf49a98ac> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf49a98ac> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf49a98ac> 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 0xf49a98ac> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf44ccccc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf4598cbc> 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 0xf432e7ec>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf432e5cc>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf3fe6d2c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_137.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMinimal.test_strided2d ________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf403af7c>, 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_strided2d'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_strided2d'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_strided2d'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_strided2d'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_strided2d'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_strided2d'>} 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_strided2d'>, '__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 0xf470ad24> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._strided2d'>, '__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 0xf3e49e8c> 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 0xf3e49e8c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i..._strided2d'>, '__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_strided2d'>, '__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_strided2d'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf3e4966c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3e4966c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3e4966c> 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 0xf3e4966c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf45b928c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf40213bc> 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 0xf3f2634c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf45fd48c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf3f26f6c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_138.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMinimal.test_bufferable _______________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3cf0ed4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf47750f4> 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 0xf42ed1cc> 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 0xf42ed1cc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf42ed08c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42ed08c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf42ed08c> 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 0xf42ed08c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf44f3c2c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf45dfbfc> 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 0xf3cc0a4c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3cc02cc>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf426310c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_139.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMinimal.test_nbytes _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf4121a74>, 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_nbytes'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_nbytes'>} 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_nbytes'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_nbytes'>} 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] kwargs = {'__multicall__': <_MultiCall 0 results, 5 meths, kwargs={'item': <AppTestMethod 'test_nbytes'>, '__multicall__': <_MultiCall 0 results, 5 meths, kwargs={...}>}>, 'item': <AppTestMethod 'test_nbytes'>} 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_nbytes'>, '__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 0xf413407c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_nbytes'>, '__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 0xf4509f2c> 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 0xf4509f2c> func = <bound method _MultiCall.execute of <_MultiCall 0 results, 5 meths, kwargs={'i...est_nbytes'>, '__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_nbytes'>, '__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_nbytes'> @pytest.hookimpl(tryfirst=True) def pytest_runtest_setup(item): if isinstance(item, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf450926c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf450926c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf450926c> 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 0xf450926c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf3e865ec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf49d208c> 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 0xf40ee36c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf40eee6c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf447402c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_140.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestOs.test_real_getenv _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3e12d14>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf466df54> 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 0xf467c16c> 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 0xf467c16c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf467c20c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf467c20c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf467c20c> 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 0xf467c20c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf4377b2c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf3ebe83c> 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 0xf3fb986c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf40563ac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf43e6dcc>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_141.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestMinimal.test_signal _________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3ee7f0c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf42371e4> 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 0xf3d56b0c> 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 0xf3d56b0c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__']} config = <rpython.config.config.Config object at 0xf3d5682c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3d5682c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3d5682c> 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 0xf3d5682c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf43c54ac> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf46db3bc> 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 0xf412af6c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf412abac>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf450ab6c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_142.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestThreadSignal.test_exit_twice _____________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3bc6ae4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf4a260a4> 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 0xf47508cc> 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 0xf47508cc> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__', 'thread', 'signal', 'time']} config = <rpython.config.config.Config object at 0xf475090c> key = (((False, False, True, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf475090c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf475090c> 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 0xf475090c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf3e958cc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf41d544c> 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 0xf436ac2c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf436ab6c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf499d52c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_143.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestThreadSignal.test_enable_signals ___________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3dc2ed4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf469343c> 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 0xf40f574c> 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 0xf40f574c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__', 'thread', 'signal', 'time']} config = <rpython.config.config.Config object at 0xf40f59ec> key = (((False, False, True, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf40f59ec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf40f59ec> 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 0xf40f59ec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf40781cc> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf468efbc> 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 0xf3dba9ec>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3dba88c>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf42fa18c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_144.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestThreadSignal.test_thread_fork_signals ________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf3b60994>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf46935f4> 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 0xf464ca6c> 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 0xf464ca6c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__', 'thread', 'signal', 'time']} config = <rpython.config.config.Config object at 0xf464c7ec> key = (((False, False, True, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf464c7ec> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf464c7ec> 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 0xf464c7ec> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf421afec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf3f9014c> 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 0xf4097a2c>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf3fb55ec>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf4097cec>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_145.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTestThreadSignalLock.test_enable_signals _________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf41e07d4>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf48a2cd4> 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 0xf3f61cac> 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 0xf3f61cac> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'usemodules': ['__pypy__', 'thread', 'signal']} config = <rpython.config.config.Config object at 0xf3f6130c> key = (((False, False, True, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3f6130c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf3f6130c> 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 0xf3f6130c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf3d3e8ec> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 0xf3ecc5fc> 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 0xf469f6ac>, <rpython.rtyper.tool.rffi_platform.D...antInteger object at 0xf469f4cc>, <rpython.rtyper.tool.rffi_platform.DefinedConstantInteger object at 0xf46e050c>, ...] 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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.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('/build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.o') cwd = '/build_dir/tmp/pytest/usession-py3.11-782' 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 = '/build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c: In function \xe2\x80\x98dump_section_447\xe2\x80\x99:\n/bu...x80\x99}\n 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port));\n | ^~~~~~~~\n' outname = local('/build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c: In function ‘dump_section_447’: E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c:6933:18: error: field ‘s’ has incomplete type E 6933 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c:6936:14: error: storage size of ‘s’ isn’t known E 6936 | platcheck_t s; E | ^ E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c:143: E /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c: In function \u2018dump_section_447\u2019:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 /build_dir/tmp/pytest/usession-py3.11-782/platcheck_146.c:143:\n[platform:Error] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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] /build_dir/tmp/pytest/usession-py3.11-782/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 AppTest.test_cpumodel ____________________ self = <CallInfo when='setup' exception: CompilationError(err=""" /build_dir/tmp/pytest/usession-py3.11-782/platcheck_147.c:...’} 6948 | dump("fldofs sq_port", offsetof(platcheck_t, sq_port)); | ^~~~~~~~ """)> func = <function <lambda> at 0xf40a9f7c>, 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 0xf7a3a32c> hook = <_HookCaller 'pytest_runtest_setup'> methods = [<_pytest.vendored_packages.pluggy.HookImpl instance at 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf69d59ac>, <_pytest.vendored_packages.pluggy.HookImpl instan...d_packages.pluggy.HookImpl instance at 0xf760970c>, <_pytest.vendored_packages.pluggy.HookImpl instance at 0xf75f0bcc>] 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 0xf41ef43c> 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 0xf45bb80c> 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 0xf45bb80c> 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, pytest.Function): config = item.config if get_marker(item, name='pypy_only'): if config.applevel is not None and not config.applevel.is_pypy: pytest.skip('PyPy-specific test') appclass = item.getparent(pytest.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', {}) > appclass.obj.space = gettestobjspace(**spaceconfig) conftest.py:254: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ kwds = {'objspace.usemodules.select': False} config = <rpython.config.config.Config object at 0xf45bb70c> key = (((False, False, False, True, True, False, ...), True, None, False, None, False, ...), 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): return TinyObjSpace() key = config.getkey() try: return _SPACECACHE[key] except KeyError: > space = maketestobjspace(config) tool/pytest/objspace.py:24: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45bb70c> 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:34: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ config = <rpython.config.config.Config object at 0xf45bb70c> 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 0xf45bb70c> @not_rpython def __init__(self, config=None): "Basic initialization of objects." self.w_default_importlib_import = None 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:455: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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()) self.w_DisallowNew = self.wrap(special.DisallowNew()) # types builtin_type_classes = { W_BoolObject.typedef: W_BoolObject, 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_AbstractIntObject, W_AbstractSeqIterObject.typedef: W_AbstractSeqIterObject, W_ListObject.typedef: W_ListObject, 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 setattr(self, 'w_' + typedef.name, w_type) self._interplevel_classes[w_type] = cls # The loop above sets space.w_str and space.w_bytes. # We rename 'space.w_str' to 'space.w_unicode' and # 'space.w_text'. self.w_unicode = self.w_str self.w_text = self.w_str del self.w_str self.w_long = self.w_int 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['str'] = self.w_unicode self.builtin_types['bytes'] = self.w_bytes self.builtin_types["NotImplemented"] = self.w_NotImplemented self.builtin_types["Ellipsis"] = self.w_Ellipsis # exceptions & builtins > self.make_builtins() objspace/std/objspace.py:115: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 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:634: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <pypy.module.imp.moduledef.Module object at 0xf3d8314c> space = StdObjSpace, args = (W_UnicodeObject('_imp'),) add_fork_hook = <function add_fork_hook at 0xf4ad49cc> 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:44: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > from pypy.module.imp import importing module/imp/interp_imp.py:1: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ import sys, os, stat, re, platform from pypy.interpreter.module import Module, init_extra_module_attrs 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 rpython.rlib import streamio, jit module/imp/importing.py:14: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ """ # 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 = Output exceeded 6164480 bytes, remaining output has been truncated program finished with exit code 1 elapsedTime=8914.645004