rsyscall-ng 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rsyscall_ng-0.1.0/LICENSE +21 -0
- rsyscall_ng-0.1.0/MANIFEST.in +16 -0
- rsyscall_ng-0.1.0/Makefile +95 -0
- rsyscall_ng-0.1.0/NOTICE +71 -0
- rsyscall_ng-0.1.0/PKG-INFO +268 -0
- rsyscall_ng-0.1.0/README.md +237 -0
- rsyscall_ng-0.1.0/docs/spec/README.md +223 -0
- rsyscall_ng-0.1.0/docs/spec/abi-layouts.generated.md +179 -0
- rsyscall_ng-0.1.0/docs/spec/bootstrap-handshakes.md +404 -0
- rsyscall_ng-0.1.0/docs/spec/evolution-notes.md +122 -0
- rsyscall_ng-0.1.0/docs/spec/native-abi.md +390 -0
- rsyscall_ng-0.1.0/docs/spec/provenance-map.md +365 -0
- rsyscall_ng-0.1.0/docs/spec/vectors/v0.json +293 -0
- rsyscall_ng-0.1.0/docs/spec/wire-protocol.md +379 -0
- rsyscall_ng-0.1.0/native/Cargo.lock +121 -0
- rsyscall_ng-0.1.0/native/Cargo.toml +20 -0
- rsyscall_ng-0.1.0/native/README.md +271 -0
- rsyscall_ng-0.1.0/native/core/Cargo.toml +19 -0
- rsyscall_ng-0.1.0/native/core/src/arch/mod.rs +6 -0
- rsyscall_ng-0.1.0/native/core/src/arch/x86_64.rs +130 -0
- rsyscall_ng-0.1.0/native/core/src/cmsg.rs +244 -0
- rsyscall_ng-0.1.0/native/core/src/cstr.rs +127 -0
- rsyscall_ng-0.1.0/native/core/src/describe.rs +113 -0
- rsyscall_ng-0.1.0/native/core/src/diag.rs +89 -0
- rsyscall_ng-0.1.0/native/core/src/io.rs +68 -0
- rsyscall_ng-0.1.0/native/core/src/lib.rs +23 -0
- rsyscall_ng-0.1.0/native/core/src/persistent.rs +143 -0
- rsyscall_ng-0.1.0/native/core/src/server.rs +39 -0
- rsyscall_ng-0.1.0/native/core/src/sys/consts.rs +111 -0
- rsyscall_ng-0.1.0/native/core/src/sys/mod.rs +220 -0
- rsyscall_ng-0.1.0/native/core/src/wire.rs +79 -0
- rsyscall_ng-0.1.0/native/core/tests/clone_asm.rs +164 -0
- rsyscall_ng-0.1.0/native/core/tests/consts.rs +71 -0
- rsyscall_ng-0.1.0/native/core/tests/cstr.rs +133 -0
- rsyscall_ng-0.1.0/native/core/tests/persistent.rs +182 -0
- rsyscall_ng-0.1.0/native/core/tests/server.rs +168 -0
- rsyscall_ng-0.1.0/native/core/tests/vectors.rs +296 -0
- rsyscall_ng-0.1.0/native/rsyscall/Cargo.toml +36 -0
- rsyscall_ng-0.1.0/native/rsyscall/build.rs +40 -0
- rsyscall_ng-0.1.0/native/rsyscall/include/rsyscall.h +103 -0
- rsyscall_ng-0.1.0/native/rsyscall/rsyscall.pc.in +10 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/bin/bootstrap.rs +169 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/bin/stdin_bootstrap.rs +76 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/bin/unix_stub.rs +178 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/lib.rs +17 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/rt/exports.rs +46 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/rt/mem.rs +97 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/rt/panic.rs +11 -0
- rsyscall_ng-0.1.0/native/rsyscall/src/rt/start.rs +31 -0
- rsyscall_ng-0.1.0/pyproject.toml +43 -0
- rsyscall_ng-0.1.0/pytest.ini +6 -0
- rsyscall_ng-0.1.0/python/arepl/__init__.py +7 -0
- rsyscall_ng-0.1.0/python/arepl/acompile.py +60 -0
- rsyscall_ng-0.1.0/python/arepl/aeval.py +45 -0
- rsyscall_ng-0.1.0/python/arepl/astcodeop.py +28 -0
- rsyscall_ng-0.1.0/python/arepl/help.py +26 -0
- rsyscall_ng-0.1.0/python/arepl/repl.py +116 -0
- rsyscall_ng-0.1.0/python/arepl/tests/__init__.py +1 -0
- rsyscall_ng-0.1.0/python/arepl/tests/test_repl.py +41 -0
- rsyscall_ng-0.1.0/python/dneio/__init__.py +86 -0
- rsyscall_ng-0.1.0/python/dneio/concur.py +145 -0
- rsyscall_ng-0.1.0/python/dneio/core.py +374 -0
- rsyscall_ng-0.1.0/python/dneio/outcome.py +14 -0
- rsyscall_ng-0.1.0/python/ffibuilder.py +1367 -0
- rsyscall_ng-0.1.0/python/rsysapps/__init__.py +0 -0
- rsyscall_ng-0.1.0/python/rsysapps/dnspython_LUA.py +30 -0
- rsyscall_ng-0.1.0/python/rsysapps/hydra.py +564 -0
- rsyscall_ng-0.1.0/python/rsysapps/mail.py +221 -0
- rsyscall_ng-0.1.0/python/rsysapps/miredo.py +182 -0
- rsyscall_ng-0.1.0/python/rsysapps/powerdns.py +252 -0
- rsyscall_ng-0.1.0/python/rsyscall/__init__.py +126 -0
- rsyscall_ng-0.1.0/python/rsyscall/_native/__init__.py +39 -0
- rsyscall_ng-0.1.0/python/rsyscall/command.py +60 -0
- rsyscall_ng-0.1.0/python/rsyscall/doc/__init__.py +1 -0
- rsyscall_ng-0.1.0/python/rsyscall/doc/syscall_api.py +425 -0
- rsyscall_ng-0.1.0/python/rsyscall/environ.py +178 -0
- rsyscall_ng-0.1.0/python/rsyscall/epoller.py +846 -0
- rsyscall_ng-0.1.0/python/rsyscall/far.py +185 -0
- rsyscall_ng-0.1.0/python/rsyscall/fcntl.py +91 -0
- rsyscall_ng-0.1.0/python/rsyscall/handle/__init__.py +302 -0
- rsyscall_ng-0.1.0/python/rsyscall/handle/fd.py +420 -0
- rsyscall_ng-0.1.0/python/rsyscall/handle/pointer.py +498 -0
- rsyscall_ng-0.1.0/python/rsyscall/handle/process.py +286 -0
- rsyscall_ng-0.1.0/python/rsyscall/inotify_watch.py +147 -0
- rsyscall_ng-0.1.0/python/rsyscall/limits.py +4 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/__init__.py +7 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/dirent.py +124 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/fs.py +34 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/fuse.py +1235 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/futex.py +69 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/memfd.py +46 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/netlink.py +39 -0
- rsyscall_ng-0.1.0/python/rsyscall/linux/rtnetlink.py +31 -0
- rsyscall_ng-0.1.0/python/rsyscall/loader.py +137 -0
- rsyscall_ng-0.1.0/python/rsyscall/memory/__init__.py +1 -0
- rsyscall_ng-0.1.0/python/rsyscall/memory/allocation_interface.py +77 -0
- rsyscall_ng-0.1.0/python/rsyscall/memory/allocator.py +345 -0
- rsyscall_ng-0.1.0/python/rsyscall/memory/ram.py +144 -0
- rsyscall_ng-0.1.0/python/rsyscall/memory/span.py +61 -0
- rsyscall_ng-0.1.0/python/rsyscall/monitor.py +303 -0
- rsyscall_ng-0.1.0/python/rsyscall/near/__init__.py +44 -0
- rsyscall_ng-0.1.0/python/rsyscall/near/sysif.py +229 -0
- rsyscall_ng-0.1.0/python/rsyscall/near/types.py +209 -0
- rsyscall_ng-0.1.0/python/rsyscall/net/__init__.py +5 -0
- rsyscall_ng-0.1.0/python/rsyscall/net/if_.py +205 -0
- rsyscall_ng-0.1.0/python/rsyscall/netinet/__init__.py +5 -0
- rsyscall_ng-0.1.0/python/rsyscall/netinet/in_.py +121 -0
- rsyscall_ng-0.1.0/python/rsyscall/netinet/ip.py +24 -0
- rsyscall_ng-0.1.0/python/rsyscall/netinet/tcp.py +48 -0
- rsyscall_ng-0.1.0/python/rsyscall/network/__init__.py +1 -0
- rsyscall_ng-0.1.0/python/rsyscall/network/connection.py +221 -0
- rsyscall_ng-0.1.0/python/rsyscall/nix.py +170 -0
- rsyscall_ng-0.1.0/python/rsyscall/path.py +26 -0
- rsyscall_ng-0.1.0/python/rsyscall/sched.py +172 -0
- rsyscall_ng-0.1.0/python/rsyscall/scripts/__init__.py +1 -0
- rsyscall_ng-0.1.0/python/rsyscall/scripts/local_repl.py +20 -0
- rsyscall_ng-0.1.0/python/rsyscall/scripts/symsh.py +255 -0
- rsyscall_ng-0.1.0/python/rsyscall/signal.py +373 -0
- rsyscall_ng-0.1.0/python/rsyscall/stdlib/__init__.py +10 -0
- rsyscall_ng-0.1.0/python/rsyscall/stdlib/mktemp.py +59 -0
- rsyscall_ng-0.1.0/python/rsyscall/struct.py +201 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/__init__.py +5 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/capability.py +150 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/epoll.py +121 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/eventfd.py +33 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/inotify.py +138 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/ioctl.py +34 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/mman.py +133 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/mount.py +74 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/prctl.py +87 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/resource.py +133 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/signalfd.py +64 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/socket.py +700 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/stat.py +148 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/syscall.py +96 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/timerfd.py +90 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/uio.py +103 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/un.py +102 -0
- rsyscall_ng-0.1.0/python/rsyscall/sys/wait.py +147 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/__init__.py +9 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/clone.py +167 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/connection.py +259 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/local.py +132 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/persistent.py +405 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/ssh.py +396 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/ssh_bootstrap.sh +6 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/stdin_bootstrap.py +143 -0
- rsyscall_ng-0.1.0/python/rsyscall/tasks/stub.py +184 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/__init__.py +1 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/conftest.py +106 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_allocator.py +18 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_benchmark.py +29 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_cat.py +35 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_chroot.py +21 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_clone.py +102 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_concurrency.py +105 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_epoller.py +102 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_eventfd.py +16 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_fd.py +20 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_fs.py +111 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_fuse.py +146 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_inotify.py +22 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_ip.py +96 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_misc.py +32 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_mmap.py +11 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_net.py +211 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_nix.py +28 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_persistent.py +104 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_pidns.py +39 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_pipe.py +39 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_pointer.py +21 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_prctl.py +19 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_proc.py +45 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_repl.py +26 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_resource.py +17 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_sched.py +10 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_seek.py +43 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_setuid.py +37 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_signal.py +18 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_socket.py +113 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_ssh.py +142 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_stdinboot.py +37 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_stub.py +51 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_timerfd.py +14 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/test_user.py +20 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/trio_test_case.py +111 -0
- rsyscall_ng-0.1.0/python/rsyscall/tests/utils.py +40 -0
- rsyscall_ng-0.1.0/python/rsyscall/thread.py +478 -0
- rsyscall_ng-0.1.0/python/rsyscall/time.py +123 -0
- rsyscall_ng-0.1.0/python/rsyscall/unistd/__init__.py +404 -0
- rsyscall_ng-0.1.0/python/rsyscall/unistd/credentials.py +64 -0
- rsyscall_ng-0.1.0/python/rsyscall/unistd/cwd.py +33 -0
- rsyscall_ng-0.1.0/python/rsyscall/unistd/exec.py +31 -0
- rsyscall_ng-0.1.0/python/rsyscall/unistd/io.py +87 -0
- rsyscall_ng-0.1.0/python/rsyscall/unistd/pipe.py +77 -0
- rsyscall_ng-0.1.0/python/rsyscall/wish.py +225 -0
- rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/PKG-INFO +268 -0
- rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/SOURCES.txt +225 -0
- rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/dependency_links.txt +1 -0
- rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/requires.txt +10 -0
- rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/top_level.txt +5 -0
- rsyscall_ng-0.1.0/python/setup.cfg +59 -0
- rsyscall_ng-0.1.0/python/wish/__init__.py +149 -0
- rsyscall_ng-0.1.0/scripts/abi-layouts.py +227 -0
- rsyscall_ng-0.1.0/scripts/baseline-compare.py +58 -0
- rsyscall_ng-0.1.0/scripts/baseline.py +111 -0
- rsyscall_ng-0.1.0/scripts/ci-setup.sh +22 -0
- rsyscall_ng-0.1.0/scripts/env.sh +29 -0
- rsyscall_ng-0.1.0/scripts/header-check.py +115 -0
- rsyscall_ng-0.1.0/scripts/hello.py +18 -0
- rsyscall_ng-0.1.0/scripts/native-install.sh +43 -0
- rsyscall_ng-0.1.0/scripts/oracle-build.sh +28 -0
- rsyscall_ng-0.1.0/scripts/preflight.sh +22 -0
- rsyscall_ng-0.1.0/scripts/probe-compare.sh +26 -0
- rsyscall_ng-0.1.0/scripts/probes/probe_eof.py +12 -0
- rsyscall_ng-0.1.0/scripts/probes/probe_oracle.py +223 -0
- rsyscall_ng-0.1.0/scripts/probes/probe_persistent.py +87 -0
- rsyscall_ng-0.1.0/scripts/pytest_session.py +44 -0
- rsyscall_ng-0.1.0/scripts/spec-lint.py +138 -0
- rsyscall_ng-0.1.0/scripts/spec-vectors.py +291 -0
- rsyscall_ng-0.1.0/scripts/venv-setup.sh +23 -0
- rsyscall_ng-0.1.0/scripts/wheel-test.sh +59 -0
- rsyscall_ng-0.1.0/setup.cfg +4 -0
- rsyscall_ng-0.1.0/setup.py +69 -0
- rsyscall_ng-0.1.0/tests/baseline-c.txt +100 -0
- rsyscall_ng-0.1.0/tests/baseline-notes.md +124 -0
- rsyscall_ng-0.1.0/tests/baseline-rust.txt +100 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Carlos Andrés Planchón Prestes
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
include LICENSE NOTICE README.md pytest.ini Makefile
|
|
2
|
+
include python/ffibuilder.py python/setup.cfg
|
|
3
|
+
include python/rsyscall/tasks/ssh_bootstrap.sh
|
|
4
|
+
include native/Cargo.toml native/Cargo.lock native/README.md
|
|
5
|
+
recursive-include native/core *
|
|
6
|
+
recursive-include native/rsyscall *
|
|
7
|
+
recursive-include docs/spec *
|
|
8
|
+
recursive-include scripts *
|
|
9
|
+
recursive-include tests *
|
|
10
|
+
prune native/target
|
|
11
|
+
prune native/prefix
|
|
12
|
+
prune reference
|
|
13
|
+
exclude python/rsyscall/_raw*.so python/rsyscall/_raw*.c
|
|
14
|
+
# prebuilt native artefacts are not source: a bundled build regenerates them (setup.py)
|
|
15
|
+
exclude python/rsyscall/_native/librsyscall.so python/rsyscall/_native/rsyscall-*
|
|
16
|
+
global-exclude __pycache__ *.py[cod]
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
SHELL := bash
|
|
2
|
+
BACKEND ?= c
|
|
3
|
+
export BACKEND
|
|
4
|
+
.PHONY: help oracle native native-test venv preflight hello baseline baseline-diff test probe probe-diff spec-check wheel wheel-manylinux wheel-test sdist sdist-test clean-venv clean-reference clean-native clean-dist
|
|
5
|
+
|
|
6
|
+
help:
|
|
7
|
+
@echo "targets (BACKEND=c|rust selects the native implementation; default c):"
|
|
8
|
+
@echo " oracle clone upstream at the pinned commit into reference/ and build its C library (backend c)"
|
|
9
|
+
@echo " native build the clean-room Rust native side and install it into native/prefix (backend rust)"
|
|
10
|
+
@echo " native-test run the Rust crate's own tests (cargo test -p rsyscall-core)"
|
|
11
|
+
@echo " venv create the backend's venv and install python/ (editable) against its prefix"
|
|
12
|
+
@echo " preflight check that the venv loads librsyscall from the backend's prefix"
|
|
13
|
+
@echo " hello smoke test: clone a process, write to its stdout, exec echo"
|
|
14
|
+
@echo " baseline run the suite, one interpreter per test, and write tests/baseline-<backend>.txt"
|
|
15
|
+
@echo " baseline-diff compare tests/baseline-c.txt with tests/baseline-rust.txt (header line ignored)"
|
|
16
|
+
@echo " test run pytest; pass arguments with PYTEST_ARGS='...'"
|
|
17
|
+
@echo " probe run the black-box probes against the backend's helper executables"
|
|
18
|
+
@echo " probe-diff run the probes against both backends and diff the normalised output"
|
|
19
|
+
@echo " spec-check verify docs/spec: generated layouts and vectors are current, citations valid"
|
|
20
|
+
@echo " wheel build the wheel (bundles the Rust native side) into dist/"
|
|
21
|
+
@echo " wheel-manylinux check the wheel (auditwheel, abi3audit) and retag it as manylinux_2_17 (uvx)"
|
|
22
|
+
@echo " wheel-test install the newest wheel into a throwaway venv and exercise it away from the source tree"
|
|
23
|
+
@echo " (RSYSCALL_WHEEL_PYTHON=3.12|3.13|3.14 selects the interpreter; default 3.14)"
|
|
24
|
+
@echo " sdist build the source distribution into dist/"
|
|
25
|
+
@echo " sdist-test build a wheel from the sdist outside the repository, as pip would (cargo included), and test it like wheel-test"
|
|
26
|
+
@echo " clean-venv remove both venvs and in-tree build artifacts"
|
|
27
|
+
@echo " clean-reference remove reference/ (oracle clone and build)"
|
|
28
|
+
@echo " clean-native remove native/prefix and native/target"
|
|
29
|
+
@echo " clean-dist remove dist/, build/ and the bundled artefacts copied into python/rsyscall/_native/"
|
|
30
|
+
|
|
31
|
+
oracle:
|
|
32
|
+
scripts/oracle-build.sh
|
|
33
|
+
|
|
34
|
+
native:
|
|
35
|
+
scripts/native-install.sh
|
|
36
|
+
|
|
37
|
+
native-test:
|
|
38
|
+
cargo test --manifest-path native/Cargo.toml -p rsyscall-core
|
|
39
|
+
|
|
40
|
+
venv:
|
|
41
|
+
scripts/venv-setup.sh
|
|
42
|
+
|
|
43
|
+
preflight:
|
|
44
|
+
scripts/preflight.sh
|
|
45
|
+
|
|
46
|
+
hello: preflight
|
|
47
|
+
source scripts/env.sh && "$$PY" scripts/hello.py
|
|
48
|
+
|
|
49
|
+
baseline: preflight
|
|
50
|
+
source scripts/env.sh && BASELINE_OUT="$$ROOT/tests/baseline-$(BACKEND).txt" "$$PY" scripts/baseline.py $(PYTEST_ARGS)
|
|
51
|
+
|
|
52
|
+
baseline-diff:
|
|
53
|
+
@diff <(sed 2d tests/baseline-c.txt) <(sed 2d tests/baseline-rust.txt) && echo "baselines identical (header line ignored)"
|
|
54
|
+
|
|
55
|
+
test: preflight
|
|
56
|
+
source scripts/env.sh && "$$PY" -m pytest $(PYTEST_ARGS)
|
|
57
|
+
|
|
58
|
+
probe:
|
|
59
|
+
source scripts/env.sh && for m in stdin stub stublong bootstrap; do python3 scripts/probes/probe_oracle.py "$$PREFIX/libexec/rsyscall" $$m; done
|
|
60
|
+
|
|
61
|
+
probe-diff:
|
|
62
|
+
scripts/probe-compare.sh
|
|
63
|
+
|
|
64
|
+
spec-check:
|
|
65
|
+
source scripts/env.sh && "$$PY" scripts/abi-layouts.py --check docs/spec/abi-layouts.generated.md
|
|
66
|
+
source scripts/env.sh && "$$PY" scripts/spec-vectors.py --check docs/spec/vectors/v0.json
|
|
67
|
+
python3 scripts/spec-lint.py
|
|
68
|
+
|
|
69
|
+
clean-venv:
|
|
70
|
+
rm -rf .venv .venv-rust python/rsyscall/_raw*.so python/rsyscall/_raw*.c python/build python/*.egg-info
|
|
71
|
+
|
|
72
|
+
clean-reference:
|
|
73
|
+
rm -rf reference
|
|
74
|
+
|
|
75
|
+
wheel:
|
|
76
|
+
rm -rf dist build && uv build --wheel --out-dir dist .
|
|
77
|
+
|
|
78
|
+
wheel-manylinux:
|
|
79
|
+
uvx --with patchelf --from auditwheel auditwheel repair --plat manylinux_2_17_x86_64 -w dist dist/rsyscall_ng-*-linux_x86_64.whl && rm dist/rsyscall_ng-*-linux_x86_64.whl
|
|
80
|
+
uvx abi3audit --strict --summary dist/rsyscall_ng-*-manylinux*.whl
|
|
81
|
+
|
|
82
|
+
wheel-test:
|
|
83
|
+
scripts/wheel-test.sh
|
|
84
|
+
|
|
85
|
+
sdist:
|
|
86
|
+
rm -f dist/rsyscall_ng-*.tar.gz && uv build --sdist --out-dir dist .
|
|
87
|
+
|
|
88
|
+
sdist-test: sdist
|
|
89
|
+
scripts/wheel-test.sh "$$(ls -t dist/rsyscall_ng-*.tar.gz | head -1)"
|
|
90
|
+
|
|
91
|
+
clean-native:
|
|
92
|
+
rm -rf native/prefix native/target
|
|
93
|
+
|
|
94
|
+
clean-dist:
|
|
95
|
+
rm -rf dist build python/rsyscall/_native/librsyscall.so python/rsyscall/_native/rsyscall-* *.egg-info python/*.egg-info
|
rsyscall_ng-0.1.0/NOTICE
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
rsyscall-ng -- provenance and licensing notice
|
|
2
|
+
==============================================
|
|
3
|
+
|
|
4
|
+
1. New code in this repository (everything outside python/, plus all changes
|
|
5
|
+
made here to python/) is Copyright (c) 2026 Carlos Andrés Planchón Prestes
|
|
6
|
+
and is released under the MIT License. See LICENSE.
|
|
7
|
+
|
|
8
|
+
2. python/ is derived from the Python package of catern/rsyscall
|
|
9
|
+
(https://github.com/catern/rsyscall). It was imported with its full git
|
|
10
|
+
history using `git filter-repo --subdirectory-filter python
|
|
11
|
+
--to-subdirectory-filter python` from upstream commit
|
|
12
|
+
2a362099610a664caeb7f06dd805e5a0fb80cd08 (2022-07-25).
|
|
13
|
+
|
|
14
|
+
Copyright (c) 2018-2022 Spencer Baugh and contributors.
|
|
15
|
+
|
|
16
|
+
License: MIT, as declared by the upstream package metadata:
|
|
17
|
+
- python/setup.py: license='MIT' and the classifier
|
|
18
|
+
"License :: OSI Approved :: MIT License";
|
|
19
|
+
- the PKG-INFO of the rsyscall 0.0.3 source distribution published on
|
|
20
|
+
PyPI (https://pypi.org/project/rsyscall/0.0.3/), which declares
|
|
21
|
+
"License: MIT".
|
|
22
|
+
Upstream ships no LICENSE file; a request to add one is open at
|
|
23
|
+
https://github.com/catern/rsyscall/issues/11. The MIT License text that
|
|
24
|
+
applies to the upstream Python code is reproduced below.
|
|
25
|
+
|
|
26
|
+
3. Deliberately NOT included in this repository: upstream c/ (librsyscall,
|
|
27
|
+
its assembly routines and the helper programs rsyscall-server,
|
|
28
|
+
rsyscall-bootstrap, rsyscall-stdin-bootstrap and rsyscall-unix-stub),
|
|
29
|
+
nixdeps/, docs/, research/ and the Nix build files at the upstream root.
|
|
30
|
+
The licensing of c/ is not declared anywhere upstream. This repository
|
|
31
|
+
only builds it locally, unmodified, from a clone placed under the
|
|
32
|
+
gitignored directory reference/ (see Makefile and scripts/), as a test
|
|
33
|
+
oracle for the differential test-suite. It is never redistributed here.
|
|
34
|
+
|
|
35
|
+
4. "rsyscall" is the name of the upstream project. This repository is an
|
|
36
|
+
independent modernization effort and is not endorsed by upstream.
|
|
37
|
+
|
|
38
|
+
5. native/ is new code under the MIT License (item 1). It reimplements the
|
|
39
|
+
native side of rsyscall from scratch as a clean-room work: it was written on
|
|
40
|
+
2026-09-29 from the specification in docs/spec/ alone, by an agent whose
|
|
41
|
+
read access excluded reference/, every C and assembly source and the Python
|
|
42
|
+
internals; the specification itself had been derived exclusively from the
|
|
43
|
+
MIT-licensed python/ tree (docs/spec/README.md §4). The reviewer, who had
|
|
44
|
+
read the upstream C earlier for an unrelated analysis, authored none of the
|
|
45
|
+
specification or of native/ and reviewed both against docs/spec/ only. The
|
|
46
|
+
upstream binaries built under reference/ served solely as a black-box test
|
|
47
|
+
oracle (recorded test outcomes and observed behaviour). See
|
|
48
|
+
native/README.md.
|
|
49
|
+
|
|
50
|
+
----------------------------------------------------------------------
|
|
51
|
+
MIT License (upstream python/ code)
|
|
52
|
+
|
|
53
|
+
Copyright (c) 2018-2022 Spencer Baugh and contributors
|
|
54
|
+
|
|
55
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
56
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
57
|
+
in the Software without restriction, including without limitation the rights
|
|
58
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
59
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
60
|
+
furnished to do so, subject to the following conditions:
|
|
61
|
+
|
|
62
|
+
The above copyright notice and this permission notice shall be included in all
|
|
63
|
+
copies or substantial portions of the Software.
|
|
64
|
+
|
|
65
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
66
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
67
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
68
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
69
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
70
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
71
|
+
SOFTWARE.
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rsyscall-ng
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Process-independent, type-safe, low-level interface to Linux system calls: rsyscall modernized, with a clean-room Rust native side
|
|
5
|
+
Author: Carlos Andrés Planchón Prestes
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Keywords: linux,syscall,distributed,trio
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
15
|
+
Classifier: Programming Language :: Rust
|
|
16
|
+
Classifier: Framework :: Trio
|
|
17
|
+
Classifier: Topic :: System :: Operating System Kernels :: Linux
|
|
18
|
+
Requires-Python: >=3.12
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
License-File: LICENSE
|
|
21
|
+
License-File: NOTICE
|
|
22
|
+
Requires-Dist: cffi>=1.15
|
|
23
|
+
Requires-Dist: trio>=0.25
|
|
24
|
+
Requires-Dist: outcome>=1.3
|
|
25
|
+
Requires-Dist: typeguard>=2
|
|
26
|
+
Provides-Extra: rsysapps
|
|
27
|
+
Requires-Dist: h11; extra == "rsysapps"
|
|
28
|
+
Provides-Extra: net
|
|
29
|
+
Requires-Dist: pyroute2; extra == "net"
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
|
|
32
|
+
# rsyscall-ng
|
|
33
|
+
|
|
34
|
+

|
|
35
|
+
|
|
36
|
+
A modernization of [rsyscall](https://github.com/catern/rsyscall), the
|
|
37
|
+
process-independent, type-safe, low-level interface to Linux system calls for
|
|
38
|
+
Python. In rsyscall every syscall is a method on a *process object*, which may
|
|
39
|
+
be the local interpreter, a child created with `clone`, or a process on a
|
|
40
|
+
remote host; new processes start out sharing everything with their parent and
|
|
41
|
+
are then shaped with ordinary syscalls (`unshare`, `execve`, ...) instead of
|
|
42
|
+
`fork`/`posix_spawn`.
|
|
43
|
+
|
|
44
|
+
[](https://github.com/carlosplanchon/rsyscall-ng/actions/workflows/ci.yml)
|
|
45
|
+
[](https://pypi.org/project/rsyscall-ng/)
|
|
46
|
+
[](https://pypi.org/project/rsyscall-ng/)
|
|
47
|
+
[](https://github.com/carlosplanchon/rsyscall-ng/blob/main/LICENSE)
|
|
48
|
+
[](https://github.com/carlosplanchon/rsyscall-ng#quick-start)
|
|
49
|
+
[](https://deepwiki.com/carlosplanchon/rsyscall-ng)
|
|
50
|
+
|
|
51
|
+
## What it looks like
|
|
52
|
+
|
|
53
|
+
A process object runs system calls in the process it stands for. Here that is a
|
|
54
|
+
child of the interpreter:
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
import trio
|
|
58
|
+
from rsyscall import local_process
|
|
59
|
+
|
|
60
|
+
async def main():
|
|
61
|
+
child = await local_process.fork() # a new process, driven from this one
|
|
62
|
+
# write(2) runs in the child, on a buffer allocated in the child's memory
|
|
63
|
+
await child.stdout.write(await child.ptr(b"Hello from the child!\n"))
|
|
64
|
+
echo = await child.environ.which("echo") # looked up on the child's PATH
|
|
65
|
+
await (await child.exec(echo.args("...now it is echo"))).check() # execve(2), then wait
|
|
66
|
+
|
|
67
|
+
trio.run(main)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The same kind of object can stand for a process on another machine. Below, the
|
|
71
|
+
Python code runs here, while the process, its `fork` and its `execve` run on
|
|
72
|
+
`worker`:
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
import trio
|
|
76
|
+
from rsyscall import local_process
|
|
77
|
+
from rsyscall.tasks.ssh import make_ssh_host
|
|
78
|
+
|
|
79
|
+
async def main():
|
|
80
|
+
host = await make_ssh_host(local_process, lambda ssh: ssh.args("worker"))
|
|
81
|
+
_, worker = await host.ssh(local_process) # a process on worker, driven from here
|
|
82
|
+
child = await worker.fork() # the fork happens on worker
|
|
83
|
+
uname = await child.environ.which("uname") # found on worker's PATH
|
|
84
|
+
await (await child.exec(uname.args("-n"))).check() # prints worker's hostname
|
|
85
|
+
|
|
86
|
+
trio.run(main)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`worker` is any x86_64 Linux machine you can reach with `ssh worker` that has a
|
|
90
|
+
POSIX shell and GNU coreutils. Nothing has to be installed there: a small static
|
|
91
|
+
bootstrap helper travels over the same ssh connection. The function passed to
|
|
92
|
+
`make_ssh_host` extends the `ssh` command line, so ssh options such as a jump
|
|
93
|
+
host or connection sharing can go there. `scripts/hello.py` is the first example
|
|
94
|
+
with more output; `make hello` and the CI run it.
|
|
95
|
+
|
|
96
|
+
## Relation to upstream
|
|
97
|
+
|
|
98
|
+
Upstream has been dormant since 2022-07-25 and its PyPI package no longer
|
|
99
|
+
installs. rsyscall-ng keeps the upstream Python API (imported with its full git
|
|
100
|
+
history under `python/`) and brings it to current Python (>= 3.12) and trio.
|
|
101
|
+
The small native part (a syscall server, a `clone` trampoline, a futex helper
|
|
102
|
+
and three bootstrap helpers, C + x86_64 assembly upstream) has been
|
|
103
|
+
reimplemented in Rust under `native/`, clean-room from the specification in
|
|
104
|
+
`docs/spec/`. The unmodified upstream C is still built locally, only as a
|
|
105
|
+
*differential test oracle* (`BACKEND=c`).
|
|
106
|
+
|
|
107
|
+
## Status
|
|
108
|
+
|
|
109
|
+
- [x] upstream `python/` imported with history (commit `2a36209`, 2022-07-25)
|
|
110
|
+
- [x] compatibility patches for Python 3.12+ / current trio and outcome
|
|
111
|
+
- [x] test harness migrated off `trio.MultiError`
|
|
112
|
+
- [x] baseline of the upstream test-suite recorded against the original C
|
|
113
|
+
backend (`tests/baseline-c.txt`)
|
|
114
|
+
- [x] clean-room v0 specification of the native side (`docs/spec/`)
|
|
115
|
+
- [x] Rust native side (`native/`): `librsyscall.so` and the three helper
|
|
116
|
+
executables, byte-compatible with the C oracle (`make baseline-diff` is
|
|
117
|
+
empty; `make probe-diff` differs only where the specification leaves
|
|
118
|
+
behaviour unspecified)
|
|
119
|
+
- [x] PEP 517 packaging: `pip install .` and `make wheel` build an abi3 wheel
|
|
120
|
+
that bundles the Rust native side (`rsyscall/_native`); `make wheel-test`
|
|
121
|
+
checks the installed wheel against the recorded baseline on CPython 3.12,
|
|
122
|
+
3.13 and 3.14, and `make sdist-test` does the same for a wheel built from
|
|
123
|
+
the sdist outside the repository
|
|
124
|
+
- [x] bootstrap helpers decoupled from Nix: `rsyscall.tasks.{stub,stdin_bootstrap,ssh}`
|
|
125
|
+
take them from `rsyscall._native` and OpenSSH from `PATH`; `test_stub`,
|
|
126
|
+
`test_stdinboot`, `test_persistent` and `test_ssh` are in the baseline, so the
|
|
127
|
+
differential test covers the helper executables
|
|
128
|
+
- [x] continuous integration on GitHub-hosted Ubuntu 24.04 runners: crate
|
|
129
|
+
tests, the differential C-vs-Rust baseline recorded on the runner, and the
|
|
130
|
+
wheel and the sdist tested on CPython 3.12 to 3.14
|
|
131
|
+
- [ ] aarch64 (later phase)
|
|
132
|
+
|
|
133
|
+
## Layout
|
|
134
|
+
|
|
135
|
+
| Path | What |
|
|
136
|
+
|----------------------------|-------------------------------------------------------------|
|
|
137
|
+
| `python/` | upstream Python package tree (`rsyscall`, `dneio`, `arepl`, `wish`, `rsysapps`) |
|
|
138
|
+
| `pyproject.toml`, `setup.py`, `MANIFEST.in` | PEP 517 packaging of `python/` (setuptools + cffi); `setup.py` builds `native/` with cargo and bundles its artefacts |
|
|
139
|
+
| `python/rsyscall/_native/` | `rsyscall._native`: where the bundled `librsyscall.so` and helper executables live, and how to find them |
|
|
140
|
+
| `scripts/` | oracle build, venv setup, baseline runner and comparer, smoke test, wheel test, spec checks, black-box probes, CI runner setup |
|
|
141
|
+
| `.github/workflows/ci.yml` | the CI workflow, described under "Continuous integration" |
|
|
142
|
+
| `tests/baseline-c.txt` | per-test status of the suite against the C backend |
|
|
143
|
+
| `docs/spec/` | clean-room v0 specification of the native side (wire protocol, native ABI, bootstrap handshakes, generated layouts and vectors) |
|
|
144
|
+
| `native/` | clean-room Rust reimplementation of the native side (`core/` logic and tests, `rsyscall/` cdylib and helper executables); see `native/README.md` |
|
|
145
|
+
| `native/prefix/` (gitignored) | the Rust native side installed by `make native` with the oracle's layout |
|
|
146
|
+
| `tests/baseline-rust.txt` | the same suite recorded against the Rust backend; identical to the C one |
|
|
147
|
+
| `reference/` (gitignored) | pinned upstream clone and the locally built C oracle |
|
|
148
|
+
| `.venv/`, `.venv-rust/` (gitignored) | the virtualenv of each backend, created by `make venv` |
|
|
149
|
+
| `dist/`, `.venv-wheel/` (gitignored) | wheels and sdists from `make wheel`; the throwaway venv of `make wheel-test` |
|
|
150
|
+
|
|
151
|
+
## Quick start
|
|
152
|
+
|
|
153
|
+
Requirements: Linux x86_64, git, [uv](https://docs.astral.sh/uv/), a C compiler
|
|
154
|
+
(for the cffi extension), Rust 1.88 or newer with cargo (`native/` uses naked functions)
|
|
155
|
+
and, for the C oracle only, autotools, libtool, pkg-config and the Linux kernel
|
|
156
|
+
headers.
|
|
157
|
+
|
|
158
|
+
```sh
|
|
159
|
+
make oracle # clone upstream at the pinned commit and build c/ into reference/prefix
|
|
160
|
+
make venv # .venv with an editable install of python/ built against the oracle
|
|
161
|
+
make hello # clone a child process, write to its stdout, exec `echo`
|
|
162
|
+
make baseline # run the suite and (re)generate tests/baseline-c.txt
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
The Rust native side is selected with `BACKEND=rust`, which switches the prefix
|
|
166
|
+
(`native/prefix`), the virtualenv (`.venv-rust`) and the recorded baseline:
|
|
167
|
+
|
|
168
|
+
```sh
|
|
169
|
+
make native # cargo build, install into native/prefix, ELF checks
|
|
170
|
+
make venv BACKEND=rust && make hello BACKEND=rust
|
|
171
|
+
make baseline BACKEND=rust && make baseline-diff # tests/baseline-rust.txt vs tests/baseline-c.txt
|
|
172
|
+
make probe-diff # black-box probes of the helper executables, both backends
|
|
173
|
+
make native-test # the crate's own tests (cargo test -p rsyscall-core)
|
|
174
|
+
python3 scripts/header-check.py # rsyscall.h against the spec's layout tables
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
In this development flow `scripts/env.sh` exports `RSYSCALL_NATIVE=prefix`: the
|
|
178
|
+
cffi extension `rsyscall._raw` is linked through pkg-config against the selected
|
|
179
|
+
backend's prefix, with its rpath baked in by `make venv` (plus `LD_LIBRARY_PATH`
|
|
180
|
+
as a belt-and-braces measure, since both venvs share the in-tree extension), and
|
|
181
|
+
`RSYSCALL_LIBEXEC_DIR` points `rsyscall._native` at that prefix's helper
|
|
182
|
+
executables. Nothing from `native/` is copied into `python/` in this mode.
|
|
183
|
+
|
|
184
|
+
## Installing and wheels
|
|
185
|
+
|
|
186
|
+
Outside the development flow the default mode, `bundled`, applies: `setup.py`
|
|
187
|
+
runs `cargo build --release` in `native/`, copies `librsyscall.so` and the three
|
|
188
|
+
helper executables into `rsyscall/_native/` and links the extension with an
|
|
189
|
+
`$ORIGIN/_native` rpath, so the installed package is self-contained and needs
|
|
190
|
+
neither Nix nor a prefix:
|
|
191
|
+
|
|
192
|
+
```sh
|
|
193
|
+
uv pip install . # or pip install .: builds native/ with cargo, nothing else to set up
|
|
194
|
+
make wheel # dist/rsyscall_ng-*.whl, abi3 (CPython 3.12+), from a clean dist/
|
|
195
|
+
make wheel-manylinux # check it (auditwheel, abi3audit) and retag it as manylinux_2_17 (uvx)
|
|
196
|
+
make wheel-test # install the newest wheel into .venv-wheel and exercise it from /tmp:
|
|
197
|
+
# import, bundled helpers, smoke test, test-suite vs tests/baseline-rust.txt
|
|
198
|
+
RSYSCALL_WHEEL_PYTHON=3.12 make wheel-test # the same on another interpreter (3.12, 3.13, 3.14)
|
|
199
|
+
make sdist # source distribution: python/ plus the native/ sources and docs/spec/
|
|
200
|
+
make sdist-test # unpack it outside the repository, build a wheel as pip would
|
|
201
|
+
# (isolated PEP 517 build, cargo included) and test it like wheel-test
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
The wheel is tagged `cp312-abi3`: the cffi extension uses only the stable ABI
|
|
205
|
+
(`abi3audit` finds no violation), so one wheel serves every CPython from 3.12 on.
|
|
206
|
+
Both the wheel and a wheel built from the sdist give the recorded baseline's
|
|
207
|
+
per-test results on 3.12, 3.13 and 3.14. Building from the sdist needs, on the
|
|
208
|
+
installing machine, cargo with Rust 1.88 or newer (the first release with naked
|
|
209
|
+
functions; 1.87 fails), a C compiler and the Python headers (`python3-dev` on
|
|
210
|
+
Debian and Ubuntu).
|
|
211
|
+
|
|
212
|
+
`rsyscall._native.helper(name)` returns the path of a bundled helper executable
|
|
213
|
+
(or of the one under `RSYSCALL_LIBEXEC_DIR`, when set) and `library_path()` the
|
|
214
|
+
bundled `librsyscall.so`, or `None` when the extension was linked against a
|
|
215
|
+
prefix. Wheels bundle only artefacts built from `native/`; the upstream C is
|
|
216
|
+
never packaged.
|
|
217
|
+
|
|
218
|
+
## Running tests
|
|
219
|
+
|
|
220
|
+
```sh
|
|
221
|
+
make test PYTEST_ARGS='-k clone' # any pytest arguments
|
|
222
|
+
RSYSCALL_TEST_OPTIONAL=1 make test # collect even the modules whose environment is missing
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Modules are ignored at collection time only when what they need is missing on
|
|
226
|
+
this machine: a Nix store (`test_nix.py`); `ssh`, `sshd` and `ssh-keygen` on
|
|
227
|
+
`PATH` or in `/usr/sbin`, `/usr/local/sbin`, `/sbin` (`test_ssh.py`,
|
|
228
|
+
`test_persistent.py`); `/dev/fuse` (`test_fuse.py`); `pyroute2` and
|
|
229
|
+
`/dev/net/tun` (`test_net.py`). `RSYSCALL_TEST_OPTIONAL=1` collects them
|
|
230
|
+
regardless, and the fourth header line of a baseline records what was ignored
|
|
231
|
+
and why. The baseline records the status of every collected test; it is a
|
|
232
|
+
description of reality, not a promise that everything passes. `make baseline`
|
|
233
|
+
runs every test in its own interpreter: the tests share the module-level
|
|
234
|
+
`rsyscall.local_process`, whose state does not survive a test being killed by
|
|
235
|
+
the timeout, so in a single process one hanging test would poison the rest.
|
|
236
|
+
Tests also leave processes behind (they share the interpreter's memory and hold
|
|
237
|
+
both ends of their syscall sockets), so `make baseline` and `make wheel-test`
|
|
238
|
+
run each pytest in a session of its own and kill its whole process group
|
|
239
|
+
afterwards (`scripts/pytest_session.py`).
|
|
240
|
+
|
|
241
|
+
## Continuous integration
|
|
242
|
+
|
|
243
|
+
`.github/workflows/ci.yml` runs on pushes to `main`, on pull requests, weekly
|
|
244
|
+
and on demand, on GitHub-hosted Ubuntu 24.04 runners. `scripts/ci-setup.sh`
|
|
245
|
+
installs autotools and the OpenSSH server and lifts Ubuntu's AppArmor
|
|
246
|
+
restriction on unprivileged user namespaces, which the test-suite creates.
|
|
247
|
+
|
|
248
|
+
- **differential** runs the crate tests, builds the Rust native side with its
|
|
249
|
+
ELF checks and the C oracle, runs the specification checks and the smoke
|
|
250
|
+
tests, and records both baselines on the runner. It fails unless the two are
|
|
251
|
+
identical. Differences from the committed baselines are only warnings,
|
|
252
|
+
because a few tests depend on the machine; the recorded baselines and the
|
|
253
|
+
per-test logs are uploaded as artifacts.
|
|
254
|
+
- **dist** builds the manylinux abi3 wheel, checked by auditwheel and
|
|
255
|
+
abi3audit, and the sdist, and uploads them as the `dist` artifact.
|
|
256
|
+
- **test-dist** installs the wheel on CPython 3.12, 3.13 and 3.14, and a wheel
|
|
257
|
+
built from the sdist, and compares each one's per-test results with the Rust
|
|
258
|
+
baseline recorded by the differential job.
|
|
259
|
+
|
|
260
|
+
Actions are pinned to commit SHAs, with the release named in a comment.
|
|
261
|
+
|
|
262
|
+
## Licensing
|
|
263
|
+
|
|
264
|
+
New code, including all of `native/`, is MIT, Copyright (c) 2026 Carlos Andrés
|
|
265
|
+
Planchón Prestes (see `LICENSE`). `python/` is MIT per upstream package
|
|
266
|
+
metadata, Copyright 2018-2022 Spencer Baugh and contributors. Upstream `c/` is
|
|
267
|
+
intentionally not part of this repository; `native/` was written from
|
|
268
|
+
`docs/spec/` alone, without access to it. See `NOTICE` for details.
|