@ai-ecoverse/slicc-kernel 1.54.2 → 1.54.3

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.
@@ -1022,7 +1022,7 @@ function openAccess(existing, oflags, rights) {
1022
1022
  return { readable: (rights & RIGHTS.FD_READ) !== 0n || !writable2, writable: writable2 };
1023
1023
  }
1024
1024
  function promoteRequest(fd, f, handed) {
1025
- const orphan = f.buffer.isOrphan();
1025
+ const orphan = f.buffer.isOrphan() || (f.buffer.handle ?? 0) < 0;
1026
1026
  if (!orphan && f.buffer.isRanged) f.buffer.flush();
1027
1027
  const joins = !orphan && (handed.has(f.buffer) || f.buffer.isRanged);
1028
1028
  return {
@@ -8713,60 +8713,201 @@ var init_wasi_module = __esm({
8713
8713
  function inProc(path) {
8714
8714
  return path === "/proc" || path.startsWith("/proc/");
8715
8715
  }
8716
+ function* procWalk(path, follow2) {
8717
+ let done = [];
8718
+ let todo = path.split("/").filter((part) => part !== "");
8719
+ let hops = 0;
8720
+ while (todo.length > 0) {
8721
+ const part = todo.shift();
8722
+ if (part === ".") continue;
8723
+ if (part === "..") {
8724
+ done.pop();
8725
+ continue;
8726
+ }
8727
+ const at = `/${[...done, part].join("/")}`;
8728
+ const whole = normalize(`/${[...done, part, ...todo].join("/")}`);
8729
+ if (inProc(at) && inProc(whole)) return whole;
8730
+ if (!follow2 && todo.length === 0) return void 0;
8731
+ const target = yield at;
8732
+ if (target === null) return void 0;
8733
+ if (target === void 0) done.push(part);
8734
+ else {
8735
+ if (++hops > MAX_HOPS2) return void 0;
8736
+ if (target.startsWith("/")) done = [];
8737
+ todo = [...target.split("/").filter((part2) => part2 !== ""), ...todo];
8738
+ }
8739
+ }
8740
+ return void 0;
8741
+ }
8742
+ function procPath(fs, path, follow2) {
8743
+ const walk = procWalk(path, follow2);
8744
+ let step = walk.next();
8745
+ while (!step.done) {
8746
+ let target;
8747
+ try {
8748
+ target = fs.lstat(step.value).isSymbolicLink ? fs.readlink(step.value) : void 0;
8749
+ } catch {
8750
+ target = null;
8751
+ }
8752
+ step = walk.next(target);
8753
+ }
8754
+ return step.value;
8755
+ }
8756
+ function frozen(bytes) {
8757
+ const refuse = () => {
8758
+ throw syncError("EROFS", "/proc");
8759
+ };
8760
+ return {
8761
+ readFile: () => bytes,
8762
+ pread: (_p, at, n) => bytes.subarray(at, at + n),
8763
+ writeFile: refuse,
8764
+ pwrite: refuse,
8765
+ truncate: refuse
8766
+ };
8767
+ }
8716
8768
  function procfsBridge(fs, tree) {
8769
+ const toProc = (path, follow2) => procPath(fs, path, follow2);
8770
+ const shadowing = () => {
8771
+ try {
8772
+ return fs.exists("/proc");
8773
+ } catch {
8774
+ return false;
8775
+ }
8776
+ };
8777
+ const via = (p, proc, own, follow2 = true) => {
8778
+ if (inProc(p)) return proc(p);
8779
+ if (shadowing()) {
8780
+ const real = toProc(p, follow2);
8781
+ if (real !== void 0) return proc(real);
8782
+ }
8783
+ try {
8784
+ return own();
8785
+ } catch (err) {
8786
+ const real = toProc(p, follow2);
8787
+ if (real === void 0) throw err;
8788
+ return proc(real);
8789
+ }
8790
+ };
8791
+ const readOnly = (paths, run) => {
8792
+ const physical = shadowing();
8793
+ for (const [p, follow2] of paths) {
8794
+ if (inProc(p) || physical && toProc(p, follow2) !== void 0) throw syncError("EROFS", p);
8795
+ }
8796
+ return run();
8797
+ };
8798
+ const snapshots = /* @__PURE__ */ new Map();
8799
+ let lastSnapshot = 0;
8800
+ const snapshot = (q) => {
8801
+ lastSnapshot--;
8802
+ snapshots.set(lastSnapshot, tree.read(q));
8803
+ return lastSnapshot;
8804
+ };
8805
+ const late = (p) => {
8806
+ const q = toProc(p, true);
8807
+ return q === void 0 ? void 0 : snapshot(q);
8808
+ };
8717
8809
  const over = {
8718
- readFile: (p) => inProc(p) ? tree.read(p) : fs.readFile(p),
8719
- stat: (p) => inProc(p) ? tree.stat(p) : fs.stat(p),
8720
- lstat: (p) => inProc(p) ? tree.stat(p, false) : fs.lstat(p),
8721
- readdir: (p) => {
8722
- if (inProc(p)) return tree.readdir(p);
8723
- const names = fs.readdir(p);
8724
- return p === "/" && !names.includes("proc") ? [...names, "proc"] : names;
8725
- },
8726
- exists: (p) => inProc(p) ? tree.exists(p) : fs.exists(p),
8727
- readlink: (p) => inProc(p) ? tree.readlink(p) : fs.readlink(p),
8728
- readdirStat: (p) => {
8729
- if (!inProc(p)) {
8730
- const listed = fs.readdirStat(p);
8731
- if (p !== "/" || listed.some(([name2]) => name2 === "proc")) return listed;
8732
- return [...listed, ["proc", tree.stat("/proc")]];
8810
+ readFile: (p) => via(
8811
+ p,
8812
+ (q) => tree.read(q),
8813
+ () => fs.readFile(p)
8814
+ ),
8815
+ stat: (p) => via(
8816
+ p,
8817
+ (q) => tree.stat(q),
8818
+ () => fs.stat(p)
8819
+ ),
8820
+ lstat: (p) => via(
8821
+ p,
8822
+ (q) => tree.stat(q, false),
8823
+ () => fs.lstat(p),
8824
+ false
8825
+ ),
8826
+ readdir: (p) => via(
8827
+ p,
8828
+ (q) => tree.readdir(q),
8829
+ () => {
8830
+ const names = fs.readdir(p);
8831
+ return p === "/" && !names.includes("proc") ? [...names, "proc"] : names;
8733
8832
  }
8734
- return tree.readdir(p).map((name2) => {
8833
+ ),
8834
+ exists: (p) => {
8835
+ if (inProc(p)) return tree.exists(p);
8836
+ const real = shadowing() ? toProc(p, true) : void 0;
8837
+ if (real !== void 0) return tree.exists(real);
8838
+ if (fs.exists(p)) return true;
8839
+ const late2 = toProc(p, true);
8840
+ return late2 !== void 0 && tree.exists(late2);
8841
+ },
8842
+ readlink: (p) => via(
8843
+ p,
8844
+ (q) => tree.readlink(q),
8845
+ () => fs.readlink(p),
8846
+ false
8847
+ ),
8848
+ readdirStat: (p) => via(
8849
+ p,
8850
+ (q) => tree.readdir(q).map((name2) => {
8735
8851
  try {
8736
- return [name2, tree.stat(`${p}/${name2}`, false)];
8852
+ return [name2, tree.stat(`${q}/${name2}`, false)];
8737
8853
  } catch {
8738
8854
  return [name2, null];
8739
8855
  }
8740
- });
8856
+ }),
8857
+ () => {
8858
+ const listed = fs.readdirStat(p);
8859
+ if (p !== "/" || listed.some(([name2]) => name2 === "proc")) return listed;
8860
+ return [...listed, ["proc", tree.stat("/proc")]];
8861
+ }
8862
+ ),
8863
+ rename: (from, to) => readOnly(
8864
+ [
8865
+ [from, false],
8866
+ [to, false]
8867
+ ],
8868
+ () => fs.rename(from, to)
8869
+ ),
8870
+ symlink: (target, link) => readOnly([[link, false]], () => fs.symlink(target, link)),
8871
+ hold: (p, held, open, handle) => {
8872
+ if (handle !== void 0 && snapshots.delete(handle)) return void 0;
8873
+ if (!held) return fs.hold?.(p, held, open, handle);
8874
+ return via(p, snapshot, () => fs.hold?.(p, held, open) ?? late(p));
8741
8875
  },
8742
- rename: (from, to) => {
8743
- if (inProc(from) || inProc(to)) throw syncError("EROFS", from);
8744
- fs.rename(from, to);
8876
+ kept: (handle) => snapshots.has(handle) || fs.kept?.(handle) === true,
8877
+ pinned: (handle) => {
8878
+ const bytes = snapshots.get(handle);
8879
+ return bytes ? frozen(bytes) : fs.pinned?.(handle) ?? fs;
8745
8880
  },
8746
- hold: (p, ...rest2) => inProc(p) ? void 0 : fs.hold?.(p, ...rest2),
8747
8881
  ...fs.pread ? {
8748
- pread: (p, at, n, version) => inProc(p) ? tree.read(p).subarray(at, at + n) : fs.pread(p, at, n, version)
8882
+ pread: (p, at, n, version) => via(
8883
+ p,
8884
+ (q) => tree.read(q).subarray(at, at + n),
8885
+ () => fs.pread(p, at, n, version)
8886
+ )
8749
8887
  } : {}
8750
8888
  };
8751
- for (const name2 of READ_ONLY) {
8752
- const fn = fs[name2];
8753
- if (!fn) continue;
8754
- over[name2] = (p, ...rest2) => {
8755
- if (inProc(p)) throw syncError("EROFS", p);
8756
- return fn.call(fs, p, ...rest2);
8757
- };
8889
+ for (const [names, follow2] of [
8890
+ [FOLLOWING, true],
8891
+ [NOT_FOLLOWING, false]
8892
+ ]) {
8893
+ for (const name2 of names) {
8894
+ const fn = fs[name2];
8895
+ if (!fn) continue;
8896
+ over[name2] = (p, ...rest2) => readOnly([[p, follow2]], () => fn.call(fs, p, ...rest2));
8897
+ }
8758
8898
  }
8759
8899
  return new Proxy(fs, {
8760
8900
  get: (target, key, receiver) => key in over ? over[key] : Reflect.get(target, key, receiver)
8761
8901
  });
8762
8902
  }
8763
- var DIR_MODE3, FILE_MODE2, LINK_MODE3, PID_NAMES, SYSTEM_NAMES, ProcTree, READ_ONLY;
8903
+ var DIR_MODE3, FILE_MODE2, LINK_MODE3, PID_NAMES, SYSTEM_NAMES, ProcTree, FOLLOWING, NOT_FOLLOWING, MAX_HOPS2;
8764
8904
  var init_wasi_procfs = __esm({
8765
8905
  "src/process/wasi/wasi-procfs.ts"() {
8766
8906
  "use strict";
8767
8907
  init_sync_fs_wire();
8768
8908
  init_process_fds();
8769
8909
  init_procfs();
8910
+ init_wasi_files();
8770
8911
  DIR_MODE3 = 16749;
8771
8912
  FILE_MODE2 = 33060;
8772
8913
  LINK_MODE3 = 41471;
@@ -8877,20 +9018,9 @@ var init_wasi_procfs = __esm({
8877
9018
  }
8878
9019
  }
8879
9020
  };
8880
- READ_ONLY = [
8881
- "writeFile",
8882
- "mkdir",
8883
- "rm",
8884
- "unlink",
8885
- "rmdir",
8886
- "symlink",
8887
- "chmod",
8888
- "utimes",
8889
- "lutimes",
8890
- "create",
8891
- "pwrite",
8892
- "truncate"
8893
- ];
9021
+ FOLLOWING = ["writeFile", "chmod", "utimes", "pwrite", "truncate"];
9022
+ NOT_FOLLOWING = ["mkdir", "rm", "unlink", "rmdir", "lutimes", "create"];
9023
+ MAX_HOPS2 = 40;
8894
9024
  }
8895
9025
  });
8896
9026