Mercurial > hgrepos > FreeBSD > ports > PyPy
view lang/pypy310/files/patch-rpython_rlib_rposix.py @ 128:9cc467368751
Move and/or copy some files from the old lang/pypy3 to lang/pypy39 and lang/pypy310
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Sun, 14 Jan 2024 12:11:20 +0100 |
| parents | lang/pypy3/files/patch-rpython_rlib_rposix.py@3b09db02a788 |
| children | 8b567a874360 |
line wrap: on
line source
--- rpython/rlib/rposix.py.orig 2023-12-24 19:15:32 UTC +++ rpython/rlib/rposix.py @@ -214,6 +214,8 @@ else: includes.append('sys/sysmacros.h') if sys.platform.startswith('freebsd') or sys.platform.startswith('openbsd'): includes.append('sys/ttycom.h') + if sys.platform.startswith('freebsd') or sys.platform.startswith('openbsd'): + includes.append('termios.h') libraries = ['util'] eci = ExternalCompilationInfo( @@ -3057,6 +3059,30 @@ if sys.platform.startswith('linux'): """Passes offset==NULL; not support on all OSes""" res = c_sendfile(out_fd, in_fd, lltype.nullptr(_OFF_PTR_T.TO), count) return handle_posix_error('sendfile', res) + +elif sys.platform.startswith('freebsd'): + # FreeBSD + # + # Please note that the implementation below is partial; + # the VOIDP is an iovec for sending headers and trailers which + # CPython uses for the headers and trailers argument, and it also + # has a flags argument. None of these are currently supported. + sendfile_eci = ExternalCompilationInfo(includes=["sys/socket.h"]) + _OFF_PTR_T = rffi.CArrayPtr(OFF_T) + # NB: the VOIDP is an struct sf_hdtr for sending headers and trailers + c_sendfile = rffi.llexternal('sendfile', + [rffi.INT, rffi.INT, OFF_T, rffi.SIZE_T, rffi.VOIDP, _OFF_PTR_T, rffi.INT], + rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO, + compilation_info=sendfile_eci) + + def sendfile(out_fd, in_fd, offset, count): + with lltype.scoped_alloc(_OFF_PTR_T.TO, 1) as sbytes: + sbytes[0] = 0 # rffi.cast(OFF_T, count) + res = c_sendfile(in_fd, out_fd, offset, count, lltype.nullptr(rffi.VOIDP.TO), sbytes, 0) + if res != 0: + return handle_posix_error('sendfile', res) + res = sbytes[0] + return res elif not _WIN32: # Neither on Windows nor on Linux, so probably a BSD derivative of
