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.
Files changed (227) hide show
  1. rsyscall_ng-0.1.0/LICENSE +21 -0
  2. rsyscall_ng-0.1.0/MANIFEST.in +16 -0
  3. rsyscall_ng-0.1.0/Makefile +95 -0
  4. rsyscall_ng-0.1.0/NOTICE +71 -0
  5. rsyscall_ng-0.1.0/PKG-INFO +268 -0
  6. rsyscall_ng-0.1.0/README.md +237 -0
  7. rsyscall_ng-0.1.0/docs/spec/README.md +223 -0
  8. rsyscall_ng-0.1.0/docs/spec/abi-layouts.generated.md +179 -0
  9. rsyscall_ng-0.1.0/docs/spec/bootstrap-handshakes.md +404 -0
  10. rsyscall_ng-0.1.0/docs/spec/evolution-notes.md +122 -0
  11. rsyscall_ng-0.1.0/docs/spec/native-abi.md +390 -0
  12. rsyscall_ng-0.1.0/docs/spec/provenance-map.md +365 -0
  13. rsyscall_ng-0.1.0/docs/spec/vectors/v0.json +293 -0
  14. rsyscall_ng-0.1.0/docs/spec/wire-protocol.md +379 -0
  15. rsyscall_ng-0.1.0/native/Cargo.lock +121 -0
  16. rsyscall_ng-0.1.0/native/Cargo.toml +20 -0
  17. rsyscall_ng-0.1.0/native/README.md +271 -0
  18. rsyscall_ng-0.1.0/native/core/Cargo.toml +19 -0
  19. rsyscall_ng-0.1.0/native/core/src/arch/mod.rs +6 -0
  20. rsyscall_ng-0.1.0/native/core/src/arch/x86_64.rs +130 -0
  21. rsyscall_ng-0.1.0/native/core/src/cmsg.rs +244 -0
  22. rsyscall_ng-0.1.0/native/core/src/cstr.rs +127 -0
  23. rsyscall_ng-0.1.0/native/core/src/describe.rs +113 -0
  24. rsyscall_ng-0.1.0/native/core/src/diag.rs +89 -0
  25. rsyscall_ng-0.1.0/native/core/src/io.rs +68 -0
  26. rsyscall_ng-0.1.0/native/core/src/lib.rs +23 -0
  27. rsyscall_ng-0.1.0/native/core/src/persistent.rs +143 -0
  28. rsyscall_ng-0.1.0/native/core/src/server.rs +39 -0
  29. rsyscall_ng-0.1.0/native/core/src/sys/consts.rs +111 -0
  30. rsyscall_ng-0.1.0/native/core/src/sys/mod.rs +220 -0
  31. rsyscall_ng-0.1.0/native/core/src/wire.rs +79 -0
  32. rsyscall_ng-0.1.0/native/core/tests/clone_asm.rs +164 -0
  33. rsyscall_ng-0.1.0/native/core/tests/consts.rs +71 -0
  34. rsyscall_ng-0.1.0/native/core/tests/cstr.rs +133 -0
  35. rsyscall_ng-0.1.0/native/core/tests/persistent.rs +182 -0
  36. rsyscall_ng-0.1.0/native/core/tests/server.rs +168 -0
  37. rsyscall_ng-0.1.0/native/core/tests/vectors.rs +296 -0
  38. rsyscall_ng-0.1.0/native/rsyscall/Cargo.toml +36 -0
  39. rsyscall_ng-0.1.0/native/rsyscall/build.rs +40 -0
  40. rsyscall_ng-0.1.0/native/rsyscall/include/rsyscall.h +103 -0
  41. rsyscall_ng-0.1.0/native/rsyscall/rsyscall.pc.in +10 -0
  42. rsyscall_ng-0.1.0/native/rsyscall/src/bin/bootstrap.rs +169 -0
  43. rsyscall_ng-0.1.0/native/rsyscall/src/bin/stdin_bootstrap.rs +76 -0
  44. rsyscall_ng-0.1.0/native/rsyscall/src/bin/unix_stub.rs +178 -0
  45. rsyscall_ng-0.1.0/native/rsyscall/src/lib.rs +17 -0
  46. rsyscall_ng-0.1.0/native/rsyscall/src/rt/exports.rs +46 -0
  47. rsyscall_ng-0.1.0/native/rsyscall/src/rt/mem.rs +97 -0
  48. rsyscall_ng-0.1.0/native/rsyscall/src/rt/panic.rs +11 -0
  49. rsyscall_ng-0.1.0/native/rsyscall/src/rt/start.rs +31 -0
  50. rsyscall_ng-0.1.0/pyproject.toml +43 -0
  51. rsyscall_ng-0.1.0/pytest.ini +6 -0
  52. rsyscall_ng-0.1.0/python/arepl/__init__.py +7 -0
  53. rsyscall_ng-0.1.0/python/arepl/acompile.py +60 -0
  54. rsyscall_ng-0.1.0/python/arepl/aeval.py +45 -0
  55. rsyscall_ng-0.1.0/python/arepl/astcodeop.py +28 -0
  56. rsyscall_ng-0.1.0/python/arepl/help.py +26 -0
  57. rsyscall_ng-0.1.0/python/arepl/repl.py +116 -0
  58. rsyscall_ng-0.1.0/python/arepl/tests/__init__.py +1 -0
  59. rsyscall_ng-0.1.0/python/arepl/tests/test_repl.py +41 -0
  60. rsyscall_ng-0.1.0/python/dneio/__init__.py +86 -0
  61. rsyscall_ng-0.1.0/python/dneio/concur.py +145 -0
  62. rsyscall_ng-0.1.0/python/dneio/core.py +374 -0
  63. rsyscall_ng-0.1.0/python/dneio/outcome.py +14 -0
  64. rsyscall_ng-0.1.0/python/ffibuilder.py +1367 -0
  65. rsyscall_ng-0.1.0/python/rsysapps/__init__.py +0 -0
  66. rsyscall_ng-0.1.0/python/rsysapps/dnspython_LUA.py +30 -0
  67. rsyscall_ng-0.1.0/python/rsysapps/hydra.py +564 -0
  68. rsyscall_ng-0.1.0/python/rsysapps/mail.py +221 -0
  69. rsyscall_ng-0.1.0/python/rsysapps/miredo.py +182 -0
  70. rsyscall_ng-0.1.0/python/rsysapps/powerdns.py +252 -0
  71. rsyscall_ng-0.1.0/python/rsyscall/__init__.py +126 -0
  72. rsyscall_ng-0.1.0/python/rsyscall/_native/__init__.py +39 -0
  73. rsyscall_ng-0.1.0/python/rsyscall/command.py +60 -0
  74. rsyscall_ng-0.1.0/python/rsyscall/doc/__init__.py +1 -0
  75. rsyscall_ng-0.1.0/python/rsyscall/doc/syscall_api.py +425 -0
  76. rsyscall_ng-0.1.0/python/rsyscall/environ.py +178 -0
  77. rsyscall_ng-0.1.0/python/rsyscall/epoller.py +846 -0
  78. rsyscall_ng-0.1.0/python/rsyscall/far.py +185 -0
  79. rsyscall_ng-0.1.0/python/rsyscall/fcntl.py +91 -0
  80. rsyscall_ng-0.1.0/python/rsyscall/handle/__init__.py +302 -0
  81. rsyscall_ng-0.1.0/python/rsyscall/handle/fd.py +420 -0
  82. rsyscall_ng-0.1.0/python/rsyscall/handle/pointer.py +498 -0
  83. rsyscall_ng-0.1.0/python/rsyscall/handle/process.py +286 -0
  84. rsyscall_ng-0.1.0/python/rsyscall/inotify_watch.py +147 -0
  85. rsyscall_ng-0.1.0/python/rsyscall/limits.py +4 -0
  86. rsyscall_ng-0.1.0/python/rsyscall/linux/__init__.py +7 -0
  87. rsyscall_ng-0.1.0/python/rsyscall/linux/dirent.py +124 -0
  88. rsyscall_ng-0.1.0/python/rsyscall/linux/fs.py +34 -0
  89. rsyscall_ng-0.1.0/python/rsyscall/linux/fuse.py +1235 -0
  90. rsyscall_ng-0.1.0/python/rsyscall/linux/futex.py +69 -0
  91. rsyscall_ng-0.1.0/python/rsyscall/linux/memfd.py +46 -0
  92. rsyscall_ng-0.1.0/python/rsyscall/linux/netlink.py +39 -0
  93. rsyscall_ng-0.1.0/python/rsyscall/linux/rtnetlink.py +31 -0
  94. rsyscall_ng-0.1.0/python/rsyscall/loader.py +137 -0
  95. rsyscall_ng-0.1.0/python/rsyscall/memory/__init__.py +1 -0
  96. rsyscall_ng-0.1.0/python/rsyscall/memory/allocation_interface.py +77 -0
  97. rsyscall_ng-0.1.0/python/rsyscall/memory/allocator.py +345 -0
  98. rsyscall_ng-0.1.0/python/rsyscall/memory/ram.py +144 -0
  99. rsyscall_ng-0.1.0/python/rsyscall/memory/span.py +61 -0
  100. rsyscall_ng-0.1.0/python/rsyscall/monitor.py +303 -0
  101. rsyscall_ng-0.1.0/python/rsyscall/near/__init__.py +44 -0
  102. rsyscall_ng-0.1.0/python/rsyscall/near/sysif.py +229 -0
  103. rsyscall_ng-0.1.0/python/rsyscall/near/types.py +209 -0
  104. rsyscall_ng-0.1.0/python/rsyscall/net/__init__.py +5 -0
  105. rsyscall_ng-0.1.0/python/rsyscall/net/if_.py +205 -0
  106. rsyscall_ng-0.1.0/python/rsyscall/netinet/__init__.py +5 -0
  107. rsyscall_ng-0.1.0/python/rsyscall/netinet/in_.py +121 -0
  108. rsyscall_ng-0.1.0/python/rsyscall/netinet/ip.py +24 -0
  109. rsyscall_ng-0.1.0/python/rsyscall/netinet/tcp.py +48 -0
  110. rsyscall_ng-0.1.0/python/rsyscall/network/__init__.py +1 -0
  111. rsyscall_ng-0.1.0/python/rsyscall/network/connection.py +221 -0
  112. rsyscall_ng-0.1.0/python/rsyscall/nix.py +170 -0
  113. rsyscall_ng-0.1.0/python/rsyscall/path.py +26 -0
  114. rsyscall_ng-0.1.0/python/rsyscall/sched.py +172 -0
  115. rsyscall_ng-0.1.0/python/rsyscall/scripts/__init__.py +1 -0
  116. rsyscall_ng-0.1.0/python/rsyscall/scripts/local_repl.py +20 -0
  117. rsyscall_ng-0.1.0/python/rsyscall/scripts/symsh.py +255 -0
  118. rsyscall_ng-0.1.0/python/rsyscall/signal.py +373 -0
  119. rsyscall_ng-0.1.0/python/rsyscall/stdlib/__init__.py +10 -0
  120. rsyscall_ng-0.1.0/python/rsyscall/stdlib/mktemp.py +59 -0
  121. rsyscall_ng-0.1.0/python/rsyscall/struct.py +201 -0
  122. rsyscall_ng-0.1.0/python/rsyscall/sys/__init__.py +5 -0
  123. rsyscall_ng-0.1.0/python/rsyscall/sys/capability.py +150 -0
  124. rsyscall_ng-0.1.0/python/rsyscall/sys/epoll.py +121 -0
  125. rsyscall_ng-0.1.0/python/rsyscall/sys/eventfd.py +33 -0
  126. rsyscall_ng-0.1.0/python/rsyscall/sys/inotify.py +138 -0
  127. rsyscall_ng-0.1.0/python/rsyscall/sys/ioctl.py +34 -0
  128. rsyscall_ng-0.1.0/python/rsyscall/sys/mman.py +133 -0
  129. rsyscall_ng-0.1.0/python/rsyscall/sys/mount.py +74 -0
  130. rsyscall_ng-0.1.0/python/rsyscall/sys/prctl.py +87 -0
  131. rsyscall_ng-0.1.0/python/rsyscall/sys/resource.py +133 -0
  132. rsyscall_ng-0.1.0/python/rsyscall/sys/signalfd.py +64 -0
  133. rsyscall_ng-0.1.0/python/rsyscall/sys/socket.py +700 -0
  134. rsyscall_ng-0.1.0/python/rsyscall/sys/stat.py +148 -0
  135. rsyscall_ng-0.1.0/python/rsyscall/sys/syscall.py +96 -0
  136. rsyscall_ng-0.1.0/python/rsyscall/sys/timerfd.py +90 -0
  137. rsyscall_ng-0.1.0/python/rsyscall/sys/uio.py +103 -0
  138. rsyscall_ng-0.1.0/python/rsyscall/sys/un.py +102 -0
  139. rsyscall_ng-0.1.0/python/rsyscall/sys/wait.py +147 -0
  140. rsyscall_ng-0.1.0/python/rsyscall/tasks/__init__.py +9 -0
  141. rsyscall_ng-0.1.0/python/rsyscall/tasks/clone.py +167 -0
  142. rsyscall_ng-0.1.0/python/rsyscall/tasks/connection.py +259 -0
  143. rsyscall_ng-0.1.0/python/rsyscall/tasks/local.py +132 -0
  144. rsyscall_ng-0.1.0/python/rsyscall/tasks/persistent.py +405 -0
  145. rsyscall_ng-0.1.0/python/rsyscall/tasks/ssh.py +396 -0
  146. rsyscall_ng-0.1.0/python/rsyscall/tasks/ssh_bootstrap.sh +6 -0
  147. rsyscall_ng-0.1.0/python/rsyscall/tasks/stdin_bootstrap.py +143 -0
  148. rsyscall_ng-0.1.0/python/rsyscall/tasks/stub.py +184 -0
  149. rsyscall_ng-0.1.0/python/rsyscall/tests/__init__.py +1 -0
  150. rsyscall_ng-0.1.0/python/rsyscall/tests/conftest.py +106 -0
  151. rsyscall_ng-0.1.0/python/rsyscall/tests/test_allocator.py +18 -0
  152. rsyscall_ng-0.1.0/python/rsyscall/tests/test_benchmark.py +29 -0
  153. rsyscall_ng-0.1.0/python/rsyscall/tests/test_cat.py +35 -0
  154. rsyscall_ng-0.1.0/python/rsyscall/tests/test_chroot.py +21 -0
  155. rsyscall_ng-0.1.0/python/rsyscall/tests/test_clone.py +102 -0
  156. rsyscall_ng-0.1.0/python/rsyscall/tests/test_concurrency.py +105 -0
  157. rsyscall_ng-0.1.0/python/rsyscall/tests/test_epoller.py +102 -0
  158. rsyscall_ng-0.1.0/python/rsyscall/tests/test_eventfd.py +16 -0
  159. rsyscall_ng-0.1.0/python/rsyscall/tests/test_fd.py +20 -0
  160. rsyscall_ng-0.1.0/python/rsyscall/tests/test_fs.py +111 -0
  161. rsyscall_ng-0.1.0/python/rsyscall/tests/test_fuse.py +146 -0
  162. rsyscall_ng-0.1.0/python/rsyscall/tests/test_inotify.py +22 -0
  163. rsyscall_ng-0.1.0/python/rsyscall/tests/test_ip.py +96 -0
  164. rsyscall_ng-0.1.0/python/rsyscall/tests/test_misc.py +32 -0
  165. rsyscall_ng-0.1.0/python/rsyscall/tests/test_mmap.py +11 -0
  166. rsyscall_ng-0.1.0/python/rsyscall/tests/test_net.py +211 -0
  167. rsyscall_ng-0.1.0/python/rsyscall/tests/test_nix.py +28 -0
  168. rsyscall_ng-0.1.0/python/rsyscall/tests/test_persistent.py +104 -0
  169. rsyscall_ng-0.1.0/python/rsyscall/tests/test_pidns.py +39 -0
  170. rsyscall_ng-0.1.0/python/rsyscall/tests/test_pipe.py +39 -0
  171. rsyscall_ng-0.1.0/python/rsyscall/tests/test_pointer.py +21 -0
  172. rsyscall_ng-0.1.0/python/rsyscall/tests/test_prctl.py +19 -0
  173. rsyscall_ng-0.1.0/python/rsyscall/tests/test_proc.py +45 -0
  174. rsyscall_ng-0.1.0/python/rsyscall/tests/test_repl.py +26 -0
  175. rsyscall_ng-0.1.0/python/rsyscall/tests/test_resource.py +17 -0
  176. rsyscall_ng-0.1.0/python/rsyscall/tests/test_sched.py +10 -0
  177. rsyscall_ng-0.1.0/python/rsyscall/tests/test_seek.py +43 -0
  178. rsyscall_ng-0.1.0/python/rsyscall/tests/test_setuid.py +37 -0
  179. rsyscall_ng-0.1.0/python/rsyscall/tests/test_signal.py +18 -0
  180. rsyscall_ng-0.1.0/python/rsyscall/tests/test_socket.py +113 -0
  181. rsyscall_ng-0.1.0/python/rsyscall/tests/test_ssh.py +142 -0
  182. rsyscall_ng-0.1.0/python/rsyscall/tests/test_stdinboot.py +37 -0
  183. rsyscall_ng-0.1.0/python/rsyscall/tests/test_stub.py +51 -0
  184. rsyscall_ng-0.1.0/python/rsyscall/tests/test_timerfd.py +14 -0
  185. rsyscall_ng-0.1.0/python/rsyscall/tests/test_user.py +20 -0
  186. rsyscall_ng-0.1.0/python/rsyscall/tests/trio_test_case.py +111 -0
  187. rsyscall_ng-0.1.0/python/rsyscall/tests/utils.py +40 -0
  188. rsyscall_ng-0.1.0/python/rsyscall/thread.py +478 -0
  189. rsyscall_ng-0.1.0/python/rsyscall/time.py +123 -0
  190. rsyscall_ng-0.1.0/python/rsyscall/unistd/__init__.py +404 -0
  191. rsyscall_ng-0.1.0/python/rsyscall/unistd/credentials.py +64 -0
  192. rsyscall_ng-0.1.0/python/rsyscall/unistd/cwd.py +33 -0
  193. rsyscall_ng-0.1.0/python/rsyscall/unistd/exec.py +31 -0
  194. rsyscall_ng-0.1.0/python/rsyscall/unistd/io.py +87 -0
  195. rsyscall_ng-0.1.0/python/rsyscall/unistd/pipe.py +77 -0
  196. rsyscall_ng-0.1.0/python/rsyscall/wish.py +225 -0
  197. rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/PKG-INFO +268 -0
  198. rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/SOURCES.txt +225 -0
  199. rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/dependency_links.txt +1 -0
  200. rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/requires.txt +10 -0
  201. rsyscall_ng-0.1.0/python/rsyscall_ng.egg-info/top_level.txt +5 -0
  202. rsyscall_ng-0.1.0/python/setup.cfg +59 -0
  203. rsyscall_ng-0.1.0/python/wish/__init__.py +149 -0
  204. rsyscall_ng-0.1.0/scripts/abi-layouts.py +227 -0
  205. rsyscall_ng-0.1.0/scripts/baseline-compare.py +58 -0
  206. rsyscall_ng-0.1.0/scripts/baseline.py +111 -0
  207. rsyscall_ng-0.1.0/scripts/ci-setup.sh +22 -0
  208. rsyscall_ng-0.1.0/scripts/env.sh +29 -0
  209. rsyscall_ng-0.1.0/scripts/header-check.py +115 -0
  210. rsyscall_ng-0.1.0/scripts/hello.py +18 -0
  211. rsyscall_ng-0.1.0/scripts/native-install.sh +43 -0
  212. rsyscall_ng-0.1.0/scripts/oracle-build.sh +28 -0
  213. rsyscall_ng-0.1.0/scripts/preflight.sh +22 -0
  214. rsyscall_ng-0.1.0/scripts/probe-compare.sh +26 -0
  215. rsyscall_ng-0.1.0/scripts/probes/probe_eof.py +12 -0
  216. rsyscall_ng-0.1.0/scripts/probes/probe_oracle.py +223 -0
  217. rsyscall_ng-0.1.0/scripts/probes/probe_persistent.py +87 -0
  218. rsyscall_ng-0.1.0/scripts/pytest_session.py +44 -0
  219. rsyscall_ng-0.1.0/scripts/spec-lint.py +138 -0
  220. rsyscall_ng-0.1.0/scripts/spec-vectors.py +291 -0
  221. rsyscall_ng-0.1.0/scripts/venv-setup.sh +23 -0
  222. rsyscall_ng-0.1.0/scripts/wheel-test.sh +59 -0
  223. rsyscall_ng-0.1.0/setup.cfg +4 -0
  224. rsyscall_ng-0.1.0/setup.py +69 -0
  225. rsyscall_ng-0.1.0/tests/baseline-c.txt +100 -0
  226. rsyscall_ng-0.1.0/tests/baseline-notes.md +124 -0
  227. 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
@@ -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
+ ![rsyscall-ng: process-independent Linux syscalls for Python](https://raw.githubusercontent.com/carlosplanchon/rsyscall-ng/main/assets/banner.jpg)
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
+ [![CI](https://github.com/carlosplanchon/rsyscall-ng/actions/workflows/ci.yml/badge.svg)](https://github.com/carlosplanchon/rsyscall-ng/actions/workflows/ci.yml)
45
+ [![PyPI version](https://img.shields.io/pypi/v/rsyscall-ng.svg)](https://pypi.org/project/rsyscall-ng/)
46
+ [![Python versions](https://img.shields.io/pypi/pyversions/rsyscall-ng.svg)](https://pypi.org/project/rsyscall-ng/)
47
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/carlosplanchon/rsyscall-ng/blob/main/LICENSE)
48
+ [![Platform: Linux x86_64](https://img.shields.io/badge/platform-Linux%20x86__64-blue.svg)](https://github.com/carlosplanchon/rsyscall-ng#quick-start)
49
+ [![DeepWiki](https://deepwiki.com/badge.svg)](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.