This is a somewhat important usecase for me which ironically the virtualisation tools which use Apple's virtualization.framework don't encounter.
Code:
wzdd@closedhonk /m/p/Projects [1]> pwd
/media/psf/Projects
wzdd@closedhonk /m/p/Projects> cat testserver.py
# Simple python sendfile() test
import socket
import os
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 8000))
s.listen(1)
conn, addr = s.accept()
f = open('test', 'rb')
os.sendfile(conn.fileno(), f.fileno(), 0, os.path.getsize('test'))
f.close()
conn.close()
if __name__ == '__main__':
main()
wzdd@closedhonk /m/p/Projects> python3 testserver.py
[run 'nc localhost 8000' elsewhere]
Traceback (most recent call last):
File "/media/psf/Projects/testserver.py", line 18, in <module>
main()
File "/media/psf/Projects/testserver.py", line 13, in main
os.sendfile(conn.fileno(), f.fileno(), 0, os.path.getsize('test'))
OSError: [Errno 22] Invalid argument
On the other hand, running it in a nonshared directory works fine:
Code:
wzdd@closedhonk /m/p/Projects [1]> cd /tmp
wzdd@closedhonk /tmp> python3 testserver.py
[nc localhost 8000]
wzdd@closedhonk /tmp>
[exits cleanly]
'test' is a small text file; it doesn't seem to matter what size it is.