kobako 0.29.0 → 0.30.0

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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/.release-please-manifest.json +1 -1
  3. data/CHANGELOG.md +217 -10
  4. data/Cargo.lock +139 -141
  5. data/README.md +96 -574
  6. data/ROADMAP.md +2 -1
  7. data/crates/kobako-runtime/CHANGELOG.md +269 -1
  8. data/crates/kobako-runtime/Cargo.toml +25 -15
  9. data/crates/kobako-runtime/README.md +7 -3
  10. data/crates/kobako-runtime/src/dispatch.rs +1 -1
  11. data/crates/kobako-runtime/src/endpoint/buffer.rs +192 -0
  12. data/crates/kobako-runtime/src/endpoint/capture.rs +115 -0
  13. data/crates/kobako-runtime/src/endpoint/dispatch.rs +253 -0
  14. data/crates/kobako-runtime/src/endpoint/invoke.rs +194 -0
  15. data/crates/kobako-runtime/src/endpoint/memory_cap.rs +238 -0
  16. data/crates/kobako-runtime/src/endpoint.rs +166 -0
  17. data/crates/kobako-runtime/src/filesystem/bind/fid.rs +82 -0
  18. data/crates/kobako-runtime/src/filesystem/{directory/spelling.rs → bind/lookup.rs} +91 -49
  19. data/crates/kobako-runtime/src/filesystem/bind/walk.rs +249 -0
  20. data/crates/kobako-runtime/src/filesystem/bind.rs +2665 -0
  21. data/crates/kobako-runtime/src/filesystem/overlay/file.rs +89 -0
  22. data/crates/kobako-runtime/src/filesystem/overlay/inode.rs +106 -0
  23. data/crates/kobako-runtime/src/filesystem/overlay/path.rs +285 -0
  24. data/crates/kobako-runtime/src/filesystem/overlay/stack/copy_up.rs +135 -0
  25. data/crates/kobako-runtime/src/filesystem/overlay/stack/dir.rs +263 -0
  26. data/crates/kobako-runtime/src/filesystem/overlay/stack/namei.rs +135 -0
  27. data/crates/kobako-runtime/src/filesystem/overlay/stack/readdir.rs +57 -0
  28. data/crates/kobako-runtime/src/filesystem/overlay/stack.rs +227 -734
  29. data/crates/kobako-runtime/src/filesystem/overlay.rs +2649 -1135
  30. data/crates/kobako-runtime/src/filesystem/path.rs +2 -41
  31. data/crates/kobako-runtime/src/filesystem/pipe.rs +221 -0
  32. data/crates/kobako-runtime/src/filesystem/rdir.rs +101 -0
  33. data/crates/kobako-runtime/src/filesystem/tmpfs/tmpfile.rs +32 -0
  34. data/crates/kobako-runtime/src/filesystem/tmpfs/whiteout.rs +85 -0
  35. data/crates/kobako-runtime/src/filesystem/tmpfs/xattr.rs +22 -0
  36. data/crates/kobako-runtime/src/filesystem/tmpfs.rs +1985 -0
  37. data/crates/kobako-runtime/src/filesystem/wrap.rs +224 -0
  38. data/crates/kobako-runtime/src/filesystem.rs +21 -387
  39. data/crates/kobako-runtime/src/hashtable.rs +44 -0
  40. data/crates/kobako-runtime/src/lib.rs +11 -6
  41. data/crates/kobako-runtime/src/locking/seqlock.rs +66 -0
  42. data/crates/kobako-runtime/src/locking.rs +218 -0
  43. data/crates/kobako-runtime/src/mount.rs +31 -104
  44. data/crates/kobako-runtime/src/profile.rs +137 -1
  45. data/crates/kobako-runtime/src/sched.rs +210 -0
  46. data/crates/kobako-runtime/src/security.rs +696 -0
  47. data/crates/kobako-runtime/src/vfs/attr.rs +162 -0
  48. data/crates/kobako-runtime/src/vfs/cred.rs +334 -0
  49. data/crates/kobako-runtime/src/vfs/dentry.rs +1412 -0
  50. data/crates/kobako-runtime/src/vfs/errno.rs +153 -0
  51. data/crates/kobako-runtime/src/vfs/file.rs +1915 -0
  52. data/crates/kobako-runtime/src/vfs/inode.rs +429 -0
  53. data/crates/kobako-runtime/src/vfs/kern_path.rs +217 -0
  54. data/crates/kobako-runtime/src/vfs/mount.rs +59 -0
  55. data/crates/kobako-runtime/src/vfs/namei.rs +5708 -0
  56. data/crates/kobako-runtime/src/vfs/openat2.rs +116 -0
  57. data/crates/kobako-runtime/src/vfs/path.rs +64 -0
  58. data/crates/kobako-runtime/src/vfs/readdir.rs +163 -0
  59. data/crates/kobako-runtime/src/vfs/stat.rs +157 -0
  60. data/crates/kobako-runtime/src/vfs/super_block.rs +122 -0
  61. data/crates/kobako-runtime/src/vfs/utimes.rs +289 -0
  62. data/crates/kobako-runtime/src/vfs.rs +60 -0
  63. data/crates/kobako-runtime/tests/linux_baseline/calls.rs +171 -0
  64. data/crates/kobako-runtime/tests/linux_baseline/concurrent.rs +276 -0
  65. data/crates/kobako-runtime/tests/linux_baseline/kobako.rs +323 -0
  66. data/crates/kobako-runtime/tests/linux_baseline/linux-baseline-expected.txt +16 -0
  67. data/crates/kobako-runtime/tests/linux_baseline/linux.rs +449 -0
  68. data/crates/kobako-runtime/tests/linux_baseline/main.rs +611 -0
  69. data/crates/kobako-runtime/tests/linux_baseline/permissions.rs +236 -0
  70. data/crates/kobako-transport/CHANGELOG.md +8 -2
  71. data/crates/kobako-transport/Cargo.toml +3 -3
  72. data/crates/kobako-transport/README.md +6 -5
  73. data/crates/kobako-transport/src/envelope/bytes.rs +33 -25
  74. data/crates/kobako-transport/src/envelope/call.rs +5 -5
  75. data/crates/kobako-transport/src/envelope/compile_reply.rs +2 -2
  76. data/crates/kobako-transport/src/envelope/error_record.rs +3 -3
  77. data/crates/kobako-transport/src/envelope/fault.rs +2 -2
  78. data/crates/kobako-transport/src/envelope/outcome.rs +3 -3
  79. data/crates/kobako-transport/src/envelope/preamble.rs +12 -12
  80. data/crates/kobako-transport/src/envelope/reply.rs +2 -2
  81. data/crates/kobako-transport/src/envelope/request.rs +2 -2
  82. data/crates/kobako-transport/src/envelope/run.rs +1 -1
  83. data/crates/kobako-transport/src/envelope/unsupported.rs +2 -2
  84. data/crates/kobako-transport/src/envelope.rs +2 -2
  85. data/crates/kobako-wasmtime/CHANGELOG.md +154 -8
  86. data/crates/kobako-wasmtime/Cargo.toml +15 -14
  87. data/crates/kobako-wasmtime/README.md +9 -5
  88. data/crates/kobako-wasmtime/src/abi.rs +12 -20
  89. data/crates/kobako-wasmtime/src/ambient.rs +1 -2
  90. data/crates/kobako-wasmtime/src/cache.rs +5 -5
  91. data/crates/kobako-wasmtime/src/config.rs +22 -7
  92. data/crates/kobako-wasmtime/src/descriptors.rs +133 -100
  93. data/crates/kobako-wasmtime/src/driver.rs +29 -96
  94. data/crates/kobako-wasmtime/src/exports.rs +5 -16
  95. data/crates/kobako-wasmtime/src/guest.rs +38 -0
  96. data/crates/kobako-wasmtime/src/imports.rs +14 -8
  97. data/crates/kobako-wasmtime/src/instance_pre.rs +3 -3
  98. data/crates/kobako-wasmtime/src/invocation.rs +26 -46
  99. data/crates/kobako-wasmtime/src/lib.rs +1 -4
  100. data/crates/kobako-wasmtime/src/limiter.rs +6 -230
  101. data/crates/kobako-wasmtime/src/preview1/differential/mount.rs +69 -46
  102. data/crates/kobako-wasmtime/src/preview1/differential.rs +121 -7
  103. data/crates/kobako-wasmtime/src/preview1/errno.rs +74 -206
  104. data/crates/kobako-wasmtime/src/preview1/fd.rs +1248 -500
  105. data/crates/kobako-wasmtime/src/preview1/memory.rs +117 -150
  106. data/crates/kobako-wasmtime/src/preview1/mount_view/wrap.rs +211 -0
  107. data/crates/kobako-wasmtime/src/preview1/mount_view.rs +1939 -672
  108. data/crates/kobako-wasmtime/src/preview1/path.rs +230 -349
  109. data/crates/kobako-wasmtime/src/preview1/poll.rs +148 -100
  110. data/crates/kobako-wasmtime/src/preview1/sock.rs +6 -23
  111. data/crates/kobako-wasmtime/src/preview1/testsuite-expected.txt +6 -0
  112. data/crates/kobako-wasmtime/src/preview1/testsuite.rs +157 -0
  113. data/crates/kobako-wasmtime/src/preview1.rs +464 -413
  114. data/crates/kobako-wasmtime/src/trap.rs +9 -9
  115. data/crates/kobako-wasmtime/src/wasi.rs +53 -37
  116. data/crates/kobako-wasmtime/tests/{guest_file.rs → integration/guest_file.rs} +232 -201
  117. data/crates/kobako-wasmtime/tests/integration/main.rs +29 -0
  118. data/crates/kobako-wasmtime/tests/{preamble_flags.rs → integration/preamble_flags.rs} +1 -1
  119. data/crates/kobako-wasmtime/tests/{snippet_compile.rs → integration/snippet_compile.rs} +1 -1
  120. data/crates/kobako-wasmtime/tests/{unanswered_call.rs → integration/unanswered_call.rs} +1 -1
  121. data/crates/kobako-wasmtime/tests/{unsupported_call.rs → integration/unsupported_call.rs} +1 -1
  122. data/crates/kobako-wasmtime/witx/typenames.witx +750 -0
  123. data/crates/kobako-wasmtime/witx/wasi_snapshot_preview1.witx +441 -0
  124. data/data/kobako.wasm +0 -0
  125. data/ext/kobako/Cargo.toml +1 -1
  126. data/ext/kobako/src/runtime/bridge.rs +1 -1
  127. data/ext/kobako/src/runtime/errors.rs +1 -1
  128. data/ext/kobako/src/runtime/escape.rs +28 -14
  129. data/ext/kobako/src/runtime/filesystem/grants.rs +21 -5
  130. data/ext/kobako/src/runtime/filesystem/ruby.rs +464 -156
  131. data/ext/kobako/src/runtime/filesystem.rs +109 -137
  132. data/ext/kobako/src/runtime/gvl.rs +43 -8
  133. data/ext/kobako/src/runtime/snapshot.rs +1 -1
  134. data/ext/kobako/src/runtime.rs +6 -1
  135. data/lib/kobako/catalog/extensions.rb +5 -5
  136. data/lib/kobako/catalog/flags.rb +2 -2
  137. data/lib/kobako/catalog/handles.rb +6 -6
  138. data/lib/kobako/catalog/mount.rb +2 -10
  139. data/lib/kobako/catalog/services.rb +2 -2
  140. data/lib/kobako/catalog/snippets.rb +7 -7
  141. data/lib/kobako/catalog.rb +1 -1
  142. data/lib/kobako/codec/decoder.rb +10 -10
  143. data/lib/kobako/codec/ext_types.rb +3 -5
  144. data/lib/kobako/codec/handle_walk.rb +4 -6
  145. data/lib/kobako/codec/nesting.rb +7 -7
  146. data/lib/kobako/codec/utils.rb +1 -1
  147. data/lib/kobako/codec/value_budget.rb +3 -3
  148. data/lib/kobako/context.rb +5 -5
  149. data/lib/kobako/filesystem.rb +44 -13
  150. data/lib/kobako/payload/arguments.rb +2 -2
  151. data/lib/kobako/pool.rb +4 -4
  152. data/lib/kobako/sandbox.rb +28 -28
  153. data/lib/kobako/sandbox_options.rb +2 -3
  154. data/lib/kobako/snippet/bytecode.rb +1 -1
  155. data/lib/kobako/snippet/source.rb +1 -1
  156. data/lib/kobako/transport/dispatcher.rb +5 -5
  157. data/lib/kobako/transport/exposure.rb +2 -2
  158. data/lib/kobako/transport/reflection.rb +7 -7
  159. data/lib/kobako/transport/run.rb +5 -5
  160. data/lib/kobako/transport/yielder.rb +1 -1
  161. data/lib/kobako/version.rb +1 -1
  162. data/lib/kobako.rb +34 -0
  163. data/release-please-config.json +1 -0
  164. data/sig/kobako/catalog/extensions.rbs +3 -3
  165. data/sig/kobako/catalog/handles.rbs +3 -3
  166. data/sig/kobako/catalog/mount.rbs +0 -4
  167. data/sig/kobako/catalog/services.rbs +1 -1
  168. data/sig/kobako/catalog/snippets.rbs +3 -3
  169. data/sig/kobako/catalog.rbs +1 -1
  170. data/sig/kobako/codec/decoder.rbs +1 -1
  171. data/sig/kobako/codec/handle_walk.rbs +1 -1
  172. data/sig/kobako/codec/nesting.rbs +2 -2
  173. data/sig/kobako/codec/utils.rbs +1 -1
  174. data/sig/kobako/codec/value_budget.rbs +1 -1
  175. data/sig/kobako/codec.rbs +1 -2
  176. data/sig/kobako/context.rbs +1 -1
  177. data/sig/kobako/filesystem.rbs +19 -14
  178. data/sig/kobako/guest_yielder.rbs +1 -1
  179. data/sig/kobako/payload/arguments.rbs +1 -1
  180. data/sig/kobako/pool.rbs +2 -2
  181. data/sig/kobako/runtime.rbs +1 -1
  182. data/sig/kobako/sandbox.rbs +3 -5
  183. data/sig/kobako/sandbox_options.rbs +1 -1
  184. data/sig/kobako/transport/dispatcher.rbs +2 -2
  185. data/sig/kobako/transport/exposure.rbs +1 -1
  186. data/sig/kobako/transport/reflection.rbs +2 -2
  187. data/sig/kobako/transport/run.rbs +3 -3
  188. data/sig/kobako/transport.rbs +1 -1
  189. metadata +67 -19
  190. data/crates/kobako-runtime/src/filesystem/directory.rs +0 -1082
  191. data/crates/kobako-runtime/src/filesystem/memory.rs +0 -1100
  192. data/crates/kobako-runtime/src/filesystem/overlay/exclusive.rs +0 -88
  193. data/crates/kobako-runtime/src/filesystem/temporary.rs +0 -167
  194. data/crates/kobako-wasmtime/src/capture.rs +0 -96
  195. data/crates/kobako-wasmtime/src/dispatch.rs +0 -125
  196. data/crates/kobako-wasmtime/src/guest_mem.rs +0 -271
  197. data/crates/kobako-wasmtime/src/io.rs +0 -89
  198. data/crates/kobako-wasmtime/src/preview1/args.rs +0 -60
  199. data/crates/kobako-wasmtime/src/preview1/beneath.rs +0 -188
  200. /data/crates/kobako-wasmtime/tests/{compile_posture.rs → integration/compile_posture.rs} +0 -0
  201. /data/crates/kobako-wasmtime/tests/{support → integration/support}/mod.rs +0 -0
@@ -0,0 +1,153 @@
1
+ //! Why a call on a Filesystem failed, under the POSIX name each failure
2
+ //! stands for, as Linux's calls answer an errno.
3
+
4
+ use crate::locking::DownError;
5
+
6
+ /// Why a Filesystem call failed, for the ABI above to encode as its error code.
7
+ #[derive(Clone, Debug, PartialEq, Eq)]
8
+ #[non_exhaustive]
9
+ pub enum FilesystemError {
10
+ NotFound,
11
+ AlreadyExists,
12
+ NotADirectory,
13
+ IsADirectory,
14
+ DirectoryNotEmpty,
15
+ PermissionDenied,
16
+ ReadOnlyFilesystem,
17
+ InvalidInput,
18
+ Unsupported,
19
+ /// A change past what the Filesystem can hold.
20
+ StorageFull,
21
+ /// A file grown past the largest the Filesystem keeps.
22
+ FileTooLarge,
23
+ /// A move that cannot happen in one step, as between two devices.
24
+ CrossesDevices,
25
+ /// A path that is absolute, climbs above the directory it is resolved
26
+ /// beneath, or holds a link that does either, as `openat2`'s
27
+ /// `RESOLVE_BENEATH` refuses one. Linux names it EXDEV as well, and an ABI
28
+ /// may have a code of its own for it.
29
+ Escape,
30
+ /// A call that would wait on a lock its own thread holds.
31
+ Deadlock,
32
+ /// A symbolic link where the call asked to follow none.
33
+ FilesystemLoop,
34
+ /// A call only a privileged caller may make, as apart from one the
35
+ /// file's permissions deny.
36
+ NotPermitted,
37
+ BadDescriptor,
38
+ ResourceBusy,
39
+ /// Bytes that are no valid character where the call needs one.
40
+ IllegalSequence,
41
+ Interrupted,
42
+ /// A call to make again, as a walk a move landed in answers.
43
+ WouldBlock,
44
+ TooManyOpenFiles,
45
+ /// A name too long for the Filesystem.
46
+ InvalidFilename,
47
+ OutOfMemory,
48
+ NotASocket,
49
+ /// A value too large for the type the call answers in.
50
+ ValueTooLarge,
51
+ NotSeekable,
52
+ /// A call the kind of file it reached cannot take, as a device that
53
+ /// allocates nothing.
54
+ NoSuchDevice,
55
+ /// A directory a lookup found standing elsewhere, which could not be moved
56
+ /// to the name it was found under.
57
+ StaleNetworkFileHandle,
58
+ /// Any other failure, with what the Filesystem knows of it.
59
+ Other(String),
60
+ }
61
+
62
+ /// Each failure a Filesystem can name under the POSIX error name it stands for.
63
+ /// `ENOTSUP` comes before `EOPNOTSUPP`, a name some hosts give the same error,
64
+ /// so `Unsupported` answers to the first.
65
+ const POSIX_NAMES: [(&str, FilesystemError); 29] = [
66
+ ("EAGAIN", FilesystemError::WouldBlock),
67
+ ("ENOENT", FilesystemError::NotFound),
68
+ ("EEXIST", FilesystemError::AlreadyExists),
69
+ ("ENOTDIR", FilesystemError::NotADirectory),
70
+ ("EISDIR", FilesystemError::IsADirectory),
71
+ ("ENOTEMPTY", FilesystemError::DirectoryNotEmpty),
72
+ ("EACCES", FilesystemError::PermissionDenied),
73
+ ("EROFS", FilesystemError::ReadOnlyFilesystem),
74
+ ("EINVAL", FilesystemError::InvalidInput),
75
+ ("ENOTSUP", FilesystemError::Unsupported),
76
+ ("EOPNOTSUPP", FilesystemError::Unsupported),
77
+ ("ENOSPC", FilesystemError::StorageFull),
78
+ ("EFBIG", FilesystemError::FileTooLarge),
79
+ ("EXDEV", FilesystemError::CrossesDevices),
80
+ ("EDEADLK", FilesystemError::Deadlock),
81
+ ("ELOOP", FilesystemError::FilesystemLoop),
82
+ ("EPERM", FilesystemError::NotPermitted),
83
+ ("EBADF", FilesystemError::BadDescriptor),
84
+ ("EBUSY", FilesystemError::ResourceBusy),
85
+ ("EILSEQ", FilesystemError::IllegalSequence),
86
+ ("EINTR", FilesystemError::Interrupted),
87
+ ("EMFILE", FilesystemError::TooManyOpenFiles),
88
+ ("ENAMETOOLONG", FilesystemError::InvalidFilename),
89
+ ("ENOMEM", FilesystemError::OutOfMemory),
90
+ ("ENOTSOCK", FilesystemError::NotASocket),
91
+ ("EOVERFLOW", FilesystemError::ValueTooLarge),
92
+ ("ESPIPE", FilesystemError::NotSeekable),
93
+ ("ENODEV", FilesystemError::NoSuchDevice),
94
+ ("ESTALE", FilesystemError::StaleNetworkFileHandle),
95
+ ];
96
+
97
+ impl From<DownError> for FilesystemError {
98
+ fn from(error: DownError) -> Self {
99
+ match error {
100
+ DownError::Deadlock => Self::Deadlock,
101
+ DownError::Interrupted => Self::Interrupted,
102
+ }
103
+ }
104
+ }
105
+
106
+ impl FilesystemError {
107
+ /// The POSIX error name this failure stands for, as `ENOENT`. `Other`
108
+ /// has none, and `Escape` shares `CrossesDevices`'s.
109
+ pub fn posix_name(&self) -> Option<&'static str> {
110
+ if *self == Self::Escape {
111
+ return Some("EXDEV");
112
+ }
113
+ POSIX_NAMES
114
+ .iter()
115
+ .find(|(_, error)| error == self)
116
+ .map(|(name, _)| *name)
117
+ }
118
+
119
+ /// The failure a POSIX error name stands for, if it is one of these.
120
+ pub fn from_posix_name(name: &str) -> Option<Self> {
121
+ POSIX_NAMES
122
+ .iter()
123
+ .find(|(known, _)| *known == name)
124
+ .map(|(_, error)| error.clone())
125
+ }
126
+ }
127
+
128
+ #[cfg(test)]
129
+ mod tests {
130
+ use super::*;
131
+
132
+ #[test]
133
+ fn every_posix_name_answers_back_to_its_failure() {
134
+ for (name, error) in &POSIX_NAMES {
135
+ assert_eq!(
136
+ FilesystemError::from_posix_name(name)
137
+ .as_ref()
138
+ .and_then(FilesystemError::posix_name)
139
+ .and_then(FilesystemError::from_posix_name),
140
+ Some(error.clone()),
141
+ "{name} through FilesystemError::from_posix_name and posix_name must name {error:?} again"
142
+ );
143
+ }
144
+ assert_eq!(
145
+ (
146
+ FilesystemError::Unsupported.posix_name(),
147
+ FilesystemError::Other("x".into()).posix_name()
148
+ ),
149
+ (Some("ENOTSUP"), None),
150
+ "Unsupported through FilesystemError::posix_name must answer ENOTSUP, and Other none"
151
+ );
152
+ }
153
+ }