@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.
@@ -4813,7 +4813,7 @@ function openAccess(existing, oflags, rights) {
4813
4813
  return { readable: (rights & RIGHTS.FD_READ) !== 0n || !writable2, writable: writable2 };
4814
4814
  }
4815
4815
  function promoteRequest(fd, f, handed) {
4816
- const orphan = f.buffer.isOrphan();
4816
+ const orphan = f.buffer.isOrphan() || (f.buffer.handle ?? 0) < 0;
4817
4817
  if (!orphan && f.buffer.isRanged) f.buffer.flush();
4818
4818
  const joins = !orphan && (handed.has(f.buffer) || f.buffer.isRanged);
4819
4819
  return {
@@ -6800,60 +6800,201 @@ var init_wasi_module = __esm({
6800
6800
  function inProc(path) {
6801
6801
  return path === "/proc" || path.startsWith("/proc/");
6802
6802
  }
6803
+ function* procWalk(path, follow2) {
6804
+ let done = [];
6805
+ let todo = path.split("/").filter((part) => part !== "");
6806
+ let hops = 0;
6807
+ while (todo.length > 0) {
6808
+ const part = todo.shift();
6809
+ if (part === ".") continue;
6810
+ if (part === "..") {
6811
+ done.pop();
6812
+ continue;
6813
+ }
6814
+ const at = `/${[...done, part].join("/")}`;
6815
+ const whole = normalize(`/${[...done, part, ...todo].join("/")}`);
6816
+ if (inProc(at) && inProc(whole)) return whole;
6817
+ if (!follow2 && todo.length === 0) return void 0;
6818
+ const target = yield at;
6819
+ if (target === null) return void 0;
6820
+ if (target === void 0) done.push(part);
6821
+ else {
6822
+ if (++hops > MAX_HOPS2) return void 0;
6823
+ if (target.startsWith("/")) done = [];
6824
+ todo = [...target.split("/").filter((part2) => part2 !== ""), ...todo];
6825
+ }
6826
+ }
6827
+ return void 0;
6828
+ }
6829
+ function procPath(fs, path, follow2) {
6830
+ const walk = procWalk(path, follow2);
6831
+ let step = walk.next();
6832
+ while (!step.done) {
6833
+ let target;
6834
+ try {
6835
+ target = fs.lstat(step.value).isSymbolicLink ? fs.readlink(step.value) : void 0;
6836
+ } catch {
6837
+ target = null;
6838
+ }
6839
+ step = walk.next(target);
6840
+ }
6841
+ return step.value;
6842
+ }
6843
+ function frozen(bytes) {
6844
+ const refuse = () => {
6845
+ throw syncError("EROFS", "/proc");
6846
+ };
6847
+ return {
6848
+ readFile: () => bytes,
6849
+ pread: (_p, at, n) => bytes.subarray(at, at + n),
6850
+ writeFile: refuse,
6851
+ pwrite: refuse,
6852
+ truncate: refuse
6853
+ };
6854
+ }
6803
6855
  function procfsBridge(fs, tree) {
6856
+ const toProc = (path, follow2) => procPath(fs, path, follow2);
6857
+ const shadowing = () => {
6858
+ try {
6859
+ return fs.exists("/proc");
6860
+ } catch {
6861
+ return false;
6862
+ }
6863
+ };
6864
+ const via = (p, proc, own, follow2 = true) => {
6865
+ if (inProc(p)) return proc(p);
6866
+ if (shadowing()) {
6867
+ const real = toProc(p, follow2);
6868
+ if (real !== void 0) return proc(real);
6869
+ }
6870
+ try {
6871
+ return own();
6872
+ } catch (err) {
6873
+ const real = toProc(p, follow2);
6874
+ if (real === void 0) throw err;
6875
+ return proc(real);
6876
+ }
6877
+ };
6878
+ const readOnly = (paths, run) => {
6879
+ const physical = shadowing();
6880
+ for (const [p, follow2] of paths) {
6881
+ if (inProc(p) || physical && toProc(p, follow2) !== void 0) throw syncError("EROFS", p);
6882
+ }
6883
+ return run();
6884
+ };
6885
+ const snapshots = /* @__PURE__ */ new Map();
6886
+ let lastSnapshot = 0;
6887
+ const snapshot = (q) => {
6888
+ lastSnapshot--;
6889
+ snapshots.set(lastSnapshot, tree.read(q));
6890
+ return lastSnapshot;
6891
+ };
6892
+ const late = (p) => {
6893
+ const q = toProc(p, true);
6894
+ return q === void 0 ? void 0 : snapshot(q);
6895
+ };
6804
6896
  const over = {
6805
- readFile: (p) => inProc(p) ? tree.read(p) : fs.readFile(p),
6806
- stat: (p) => inProc(p) ? tree.stat(p) : fs.stat(p),
6807
- lstat: (p) => inProc(p) ? tree.stat(p, false) : fs.lstat(p),
6808
- readdir: (p) => {
6809
- if (inProc(p)) return tree.readdir(p);
6810
- const names = fs.readdir(p);
6811
- return p === "/" && !names.includes("proc") ? [...names, "proc"] : names;
6812
- },
6813
- exists: (p) => inProc(p) ? tree.exists(p) : fs.exists(p),
6814
- readlink: (p) => inProc(p) ? tree.readlink(p) : fs.readlink(p),
6815
- readdirStat: (p) => {
6816
- if (!inProc(p)) {
6817
- const listed = fs.readdirStat(p);
6818
- if (p !== "/" || listed.some(([name2]) => name2 === "proc")) return listed;
6819
- return [...listed, ["proc", tree.stat("/proc")]];
6897
+ readFile: (p) => via(
6898
+ p,
6899
+ (q) => tree.read(q),
6900
+ () => fs.readFile(p)
6901
+ ),
6902
+ stat: (p) => via(
6903
+ p,
6904
+ (q) => tree.stat(q),
6905
+ () => fs.stat(p)
6906
+ ),
6907
+ lstat: (p) => via(
6908
+ p,
6909
+ (q) => tree.stat(q, false),
6910
+ () => fs.lstat(p),
6911
+ false
6912
+ ),
6913
+ readdir: (p) => via(
6914
+ p,
6915
+ (q) => tree.readdir(q),
6916
+ () => {
6917
+ const names = fs.readdir(p);
6918
+ return p === "/" && !names.includes("proc") ? [...names, "proc"] : names;
6820
6919
  }
6821
- return tree.readdir(p).map((name2) => {
6920
+ ),
6921
+ exists: (p) => {
6922
+ if (inProc(p)) return tree.exists(p);
6923
+ const real = shadowing() ? toProc(p, true) : void 0;
6924
+ if (real !== void 0) return tree.exists(real);
6925
+ if (fs.exists(p)) return true;
6926
+ const late2 = toProc(p, true);
6927
+ return late2 !== void 0 && tree.exists(late2);
6928
+ },
6929
+ readlink: (p) => via(
6930
+ p,
6931
+ (q) => tree.readlink(q),
6932
+ () => fs.readlink(p),
6933
+ false
6934
+ ),
6935
+ readdirStat: (p) => via(
6936
+ p,
6937
+ (q) => tree.readdir(q).map((name2) => {
6822
6938
  try {
6823
- return [name2, tree.stat(`${p}/${name2}`, false)];
6939
+ return [name2, tree.stat(`${q}/${name2}`, false)];
6824
6940
  } catch {
6825
6941
  return [name2, null];
6826
6942
  }
6827
- });
6943
+ }),
6944
+ () => {
6945
+ const listed = fs.readdirStat(p);
6946
+ if (p !== "/" || listed.some(([name2]) => name2 === "proc")) return listed;
6947
+ return [...listed, ["proc", tree.stat("/proc")]];
6948
+ }
6949
+ ),
6950
+ rename: (from, to) => readOnly(
6951
+ [
6952
+ [from, false],
6953
+ [to, false]
6954
+ ],
6955
+ () => fs.rename(from, to)
6956
+ ),
6957
+ symlink: (target, link) => readOnly([[link, false]], () => fs.symlink(target, link)),
6958
+ hold: (p, held, open, handle) => {
6959
+ if (handle !== void 0 && snapshots.delete(handle)) return void 0;
6960
+ if (!held) return fs.hold?.(p, held, open, handle);
6961
+ return via(p, snapshot, () => fs.hold?.(p, held, open) ?? late(p));
6828
6962
  },
6829
- rename: (from, to) => {
6830
- if (inProc(from) || inProc(to)) throw syncError("EROFS", from);
6831
- fs.rename(from, to);
6963
+ kept: (handle) => snapshots.has(handle) || fs.kept?.(handle) === true,
6964
+ pinned: (handle) => {
6965
+ const bytes = snapshots.get(handle);
6966
+ return bytes ? frozen(bytes) : fs.pinned?.(handle) ?? fs;
6832
6967
  },
6833
- hold: (p, ...rest2) => inProc(p) ? void 0 : fs.hold?.(p, ...rest2),
6834
6968
  ...fs.pread ? {
6835
- pread: (p, at, n, version) => inProc(p) ? tree.read(p).subarray(at, at + n) : fs.pread(p, at, n, version)
6969
+ pread: (p, at, n, version) => via(
6970
+ p,
6971
+ (q) => tree.read(q).subarray(at, at + n),
6972
+ () => fs.pread(p, at, n, version)
6973
+ )
6836
6974
  } : {}
6837
6975
  };
6838
- for (const name2 of READ_ONLY) {
6839
- const fn = fs[name2];
6840
- if (!fn) continue;
6841
- over[name2] = (p, ...rest2) => {
6842
- if (inProc(p)) throw syncError("EROFS", p);
6843
- return fn.call(fs, p, ...rest2);
6844
- };
6976
+ for (const [names, follow2] of [
6977
+ [FOLLOWING, true],
6978
+ [NOT_FOLLOWING, false]
6979
+ ]) {
6980
+ for (const name2 of names) {
6981
+ const fn = fs[name2];
6982
+ if (!fn) continue;
6983
+ over[name2] = (p, ...rest2) => readOnly([[p, follow2]], () => fn.call(fs, p, ...rest2));
6984
+ }
6845
6985
  }
6846
6986
  return new Proxy(fs, {
6847
6987
  get: (target, key, receiver) => key in over ? over[key] : Reflect.get(target, key, receiver)
6848
6988
  });
6849
6989
  }
6850
- var DIR_MODE3, FILE_MODE2, LINK_MODE3, PID_NAMES, SYSTEM_NAMES, ProcTree, READ_ONLY;
6990
+ var DIR_MODE3, FILE_MODE2, LINK_MODE3, PID_NAMES, SYSTEM_NAMES, ProcTree, FOLLOWING, NOT_FOLLOWING, MAX_HOPS2;
6851
6991
  var init_wasi_procfs = __esm({
6852
6992
  "src/process/wasi/wasi-procfs.ts"() {
6853
6993
  "use strict";
6854
6994
  init_sync_fs_wire();
6855
6995
  init_process_fds();
6856
6996
  init_procfs();
6997
+ init_wasi_files();
6857
6998
  DIR_MODE3 = 16749;
6858
6999
  FILE_MODE2 = 33060;
6859
7000
  LINK_MODE3 = 41471;
@@ -6964,20 +7105,9 @@ var init_wasi_procfs = __esm({
6964
7105
  }
6965
7106
  }
6966
7107
  };
6967
- READ_ONLY = [
6968
- "writeFile",
6969
- "mkdir",
6970
- "rm",
6971
- "unlink",
6972
- "rmdir",
6973
- "symlink",
6974
- "chmod",
6975
- "utimes",
6976
- "lutimes",
6977
- "create",
6978
- "pwrite",
6979
- "truncate"
6980
- ];
7108
+ FOLLOWING = ["writeFile", "chmod", "utimes", "pwrite", "truncate"];
7109
+ NOT_FOLLOWING = ["mkdir", "rm", "unlink", "rmdir", "lutimes", "create"];
7110
+ MAX_HOPS2 = 40;
6981
7111
  }
6982
7112
  });
6983
7113