@ai-ecoverse/slicc-kernel 1.125.2 → 1.125.4

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.
@@ -4588,6 +4588,7 @@ function filetypeOf(s) {
4588
4588
  if (s.isSymbolicLink) return FILETYPE.SYMBOLIC_LINK;
4589
4589
  if (s.isDirectory) return FILETYPE.DIRECTORY;
4590
4590
  if (s.isSocket) return FILETYPE.SOCKET_STREAM;
4591
+ if (((s.mode ?? 0) & 61440) === 8192) return FILETYPE.CHARACTER_DEVICE;
4591
4592
  return s.isFile ? FILETYPE.REGULAR_FILE : FILETYPE.UNKNOWN;
4592
4593
  }
4593
4594
  function filestatOf(path, s) {
@@ -4829,7 +4830,11 @@ var init_wasi_host = __esm({
4829
4830
  }
4830
4831
  if (this.synthetic(path)) return ROOT_IDS;
4831
4832
  if (kernelDev(path)) return devSync(dev, devStat(path, follow3));
4832
- return follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path);
4833
+ return this.orDev(
4834
+ path,
4835
+ follow3,
4836
+ () => follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path)
4837
+ );
4833
4838
  };
4834
4839
  return wrap({
4835
4840
  fd_chown: (fd, uid, gid) => {
@@ -4908,7 +4913,16 @@ var init_wasi_host = __esm({
4908
4913
  const node = devSync(dev, devStat(path, (flags & AT_SYMLINK_NOFOLLOW) === 0));
4909
4914
  return void mem.view().setUint32(out, node.mode ?? DEVICE_MODE, true);
4910
4915
  }
4911
- const st = flags & AT_SYMLINK_NOFOLLOW ? this.o.fs.lstat(path) : this.o.fs.stat(path);
4916
+ const follow3 = (flags & AT_SYMLINK_NOFOLLOW) === 0;
4917
+ let st;
4918
+ try {
4919
+ st = follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path);
4920
+ } catch (err) {
4921
+ const device2 = this.orDev(path, follow3, () => {
4922
+ throw err;
4923
+ });
4924
+ return void mem.view().setUint32(out, device2.mode ?? DEVICE_MODE, true);
4925
+ }
4912
4926
  mem.view().setUint32(out, (st.isFifo ? S_IFIFO : 0) | modeOf2(st), true);
4913
4927
  }
4914
4928
  });
@@ -5618,6 +5632,21 @@ var init_wasi_host = __esm({
5618
5632
  synthetic(path) {
5619
5633
  return deviceOf(path) !== void 0 || path === SEALED_PATH && !!this.o.kernel.sys.openSealed || path === CLIPBOARD_PATH && !!this.o.kernel.sys.openClipboard;
5620
5634
  }
5635
+ linkedDev(path, follow3) {
5636
+ if (!follow3) return void 0;
5637
+ const real = physicalPath(this.o.fs, path);
5638
+ return real !== path && kernelDev(real) ? real : void 0;
5639
+ }
5640
+ orDev(path, follow3, stat) {
5641
+ try {
5642
+ return stat();
5643
+ } catch (err) {
5644
+ const device2 = err.code === "ENOENT" && this.linkedDev(path, follow3);
5645
+ if (!device2) throw err;
5646
+ const json2 = (req) => this.o.kernel.call(req);
5647
+ return devSync({ json: json2 }, devStat(device2, true));
5648
+ }
5649
+ }
5621
5650
  devChar(path, follow3) {
5622
5651
  try {
5623
5652
  const json2 = (req) => this.o.kernel.call(req);
@@ -5725,11 +5754,12 @@ var init_wasi_host = __esm({
5725
5754
  return filestatOf(path, follow3 ? this.o.fs.stat(path) : this.o.fs.lstat(path));
5726
5755
  } catch (err) {
5727
5756
  if (err.code !== "ENOENT") throw err;
5728
- if (kernelDev(path) && this.devChar(path, follow3)) {
5757
+ const device2 = kernelDev(path) ? path : this.linkedDev(path, follow3);
5758
+ if (device2 && this.devChar(device2, true)) {
5729
5759
  return this.local({
5730
5760
  filetype: FILETYPE.CHARACTER_DEVICE,
5731
5761
  size: 0n,
5732
- ino: pathInode(path),
5762
+ ino: pathInode(device2),
5733
5763
  mtimeNs: 0n
5734
5764
  });
5735
5765
  }
@@ -6295,7 +6325,7 @@ var KERNEL_VERSION, OS_RELEASE;
6295
6325
  var init_version = __esm({
6296
6326
  "src/version.ts"() {
6297
6327
  "use strict";
6298
- KERNEL_VERSION = true ? "1.125.2" : "0.0.0-dev";
6328
+ KERNEL_VERSION = true ? "1.125.4" : "0.0.0-dev";
6299
6329
  OS_RELEASE = "6.0.0-slicc";
6300
6330
  }
6301
6331
  });
@@ -12610,7 +12640,7 @@ function datesOf(real) {
12610
12640
  dates[key] = new Date(value2);
12611
12641
  return dates;
12612
12642
  }
12613
- var POLLIN, POLLOUT, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, TCSETSF, O_NONBLOCK2, SOCKET_MODE, PTY_PATH, TTY_PATH, TTY_NAME, SEALED_PATH2, STRERROR, CLIPBOARD_PATH2, O_CREAT2, O_EXCL2, O_NOCTTY, O_TRUNC3, O_DIRECTORY, KILLED_BY_SIGPIPE, ProcessExit, SyscallError, KernelStreams;
12643
+ var POLLIN, POLLOUT, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, TCSETSF, O_NONBLOCK2, SOCKET_MODE, PTY_PATH, TTY_PATH, PTS_MAJOR, TTY_NAME, SEALED_PATH2, STRERROR, CLIPBOARD_PATH2, O_CREAT2, O_EXCL2, O_NOCTTY, O_TRUNC3, O_DIRECTORY, KILLED_BY_SIGPIPE, ProcessExit, SyscallError, KernelStreams;
12614
12644
  var init_kernel_streams = __esm({
12615
12645
  "src/process/kernel-streams.ts"() {
12616
12646
  "use strict";
@@ -12627,6 +12657,7 @@ var init_kernel_streams = __esm({
12627
12657
  SOCKET_MODE = 49663;
12628
12658
  PTY_PATH = /^\/dev\/(?:ptmx|pts\/(\d+))$/;
12629
12659
  TTY_PATH = /^\/dev\/tty\d+$/;
12660
+ PTS_MAJOR = 136;
12630
12661
  TTY_NAME = /^tty\d+$/;
12631
12662
  SEALED_PATH2 = "/dev/sealed";
12632
12663
  STRERROR = {
@@ -12838,6 +12869,48 @@ var init_kernel_streams = __esm({
12838
12869
  return [...names, ...missing2];
12839
12870
  };
12840
12871
  }
12872
+ usePtsNodes() {
12873
+ const fs = this.Fs;
12874
+ const { lookupNode, readdir, getPath, mkdir, mkdev, makedev } = fs;
12875
+ const numbers = this.sys.ptyNumbers?.bind(this.sys);
12876
+ if (!lookupNode || !readdir || !getPath || !mkdir || !mkdev || !makedev || !numbers) return;
12877
+ const make = (parent, name2) => {
12878
+ const dir = getPath.call(fs, parent);
12879
+ if (dir === "/dev" && name2 === "pts") mkdir.call(fs, "/dev/pts", 493);
12880
+ else if (dir === "/dev/pts" && numbers().includes(Number(name2)) && /^\d+$/.test(name2))
12881
+ mkdev.call(fs, `/dev/pts/${name2}`, makedev.call(fs, PTS_MAJOR, Number(name2)));
12882
+ else return false;
12883
+ return true;
12884
+ };
12885
+ fs.lookupNode = (parent, name2) => {
12886
+ try {
12887
+ return lookupNode.call(fs, parent, name2);
12888
+ } catch (e) {
12889
+ if (this.creatingTerminal) throw e;
12890
+ this.creatingTerminal = true;
12891
+ let made;
12892
+ try {
12893
+ made = make(parent, name2);
12894
+ } finally {
12895
+ this.creatingTerminal = false;
12896
+ }
12897
+ if (!made) throw e;
12898
+ return lookupNode.call(fs, parent, name2);
12899
+ }
12900
+ };
12901
+ fs.readdir = (path) => {
12902
+ const at = path.replace(/\/+$/, "");
12903
+ if (at === "/dev/pts") return [".", "..", ...numbers().map(String)];
12904
+ const names = readdir.call(fs, path);
12905
+ return at === "/dev" && !names.includes("pts") ? [...names, "pts"] : names;
12906
+ };
12907
+ }
12908
+ ptsTarget(path, st) {
12909
+ if ((st?.rdev ?? 0) >> 8 !== PTS_MAJOR) return void 0;
12910
+ const { lookupPath } = this.Fs;
12911
+ const real = lookupPath?.call(this.Fs, path, { follow: true }).path;
12912
+ return real !== void 0 && isPtyPath(real) ? real : void 0;
12913
+ }
12841
12914
  ttyNode(name2) {
12842
12915
  const { analyzePath, mkdev, makedev } = this.Fs;
12843
12916
  if (!TTY_PATH.test(name2) || !analyzePath || !mkdev || !makedev) return;
@@ -12913,6 +12986,7 @@ var init_kernel_streams = __esm({
12913
12986
  if (typeof this.Fs.open !== "function") return;
12914
12987
  this.usePtyPaths();
12915
12988
  this.useTerminalNodes();
12989
+ this.usePtsNodes();
12916
12990
  this.listSealed();
12917
12991
  const open = this.Fs.open.bind(this.Fs);
12918
12992
  this.Fs.open = (path, flags, mode) => {
@@ -13028,15 +13102,21 @@ var init_kernel_streams = __esm({
13028
13102
  if (path === CLIPBOARD_PATH2 && this.sys.openClipboard) return sealedStat(251);
13029
13103
  const owned = this.ownedTty(path);
13030
13104
  if (owned && isPtyPath(path)) return this.owned(path, ptyStat(path));
13031
- if (!isPtyPath(path)) {
13032
- const st = original.call(fs, path, ...rest2);
13033
- return owned && TTY_PATH.test(path) ? this.owned(path, st) : st;
13034
- }
13105
+ if (!isPtyPath(path))
13106
+ return this.pathStat(path, original.call(fs, path, ...rest2), name2, owned);
13035
13107
  this.existingPty(path);
13036
13108
  return ptyStat(path);
13037
13109
  };
13038
13110
  }
13039
13111
  }
13112
+ pathStat(path, st, name2, owned) {
13113
+ const pts = name2 === "stat" ? this.ptsTarget(path, st) : void 0;
13114
+ if (pts) {
13115
+ this.existingPty(pts);
13116
+ return owned ? this.owned(pts, ptyStat(pts)) : ptyStat(pts);
13117
+ }
13118
+ return owned && TTY_PATH.test(path) ? this.owned(path, st) : st;
13119
+ }
13040
13120
  ownedTty(path) {
13041
13121
  return this.options.owners === true && this.sys.ttyOwner !== void 0 && path !== "/dev/ptmx";
13042
13122
  }
@@ -14793,6 +14873,60 @@ var init_wasi_module = __esm({
14793
14873
  }
14794
14874
  });
14795
14875
 
14876
+ // src/process/wasi/wasi-ptsfs.ts
14877
+ function ptsBridge(fs, call2) {
14878
+ const open = () => call2({ op: "pty-list" });
14879
+ const kernel = { json: (req) => call2(req) };
14880
+ const entry = (p) => {
14881
+ const n = PTS_ENTRY.exec(p)?.[1];
14882
+ if (n === void 0 || !open().includes(Number(n))) throw syncError("ENOENT", p);
14883
+ return devSync(kernel, devStat(p, true));
14884
+ };
14885
+ const dir = () => devSync(kernel, devStat(PTS, true));
14886
+ const statOf = (p, real) => {
14887
+ if (p === PTS) return dir();
14888
+ return PTS_ENTRY.test(p) ? entry(p) : real();
14889
+ };
14890
+ const names = () => open().map(String).sort();
14891
+ const over = {
14892
+ stat: (p) => statOf(p, () => fs.stat(p)),
14893
+ lstat: (p) => statOf(p, () => fs.lstat(p)),
14894
+ exists: (p) => {
14895
+ if (p === PTS) return true;
14896
+ if (!PTS_ENTRY.test(p)) return fs.exists(p);
14897
+ return open().includes(Number(PTS_ENTRY.exec(p)?.[1]));
14898
+ },
14899
+ readdir: (p) => {
14900
+ if (p === PTS) return names();
14901
+ const listed = fs.readdir(p);
14902
+ return p === "/dev" && !listed.includes("pts") ? [...listed, "pts"] : listed;
14903
+ },
14904
+ readdirStat: (p) => {
14905
+ if (p === PTS) return names().map((name2) => [name2, entry(`${PTS}/${name2}`)]);
14906
+ const listed = fs.readdirStat(p);
14907
+ if (p !== "/dev" || listed.some(([name2]) => name2 === "pts")) return listed;
14908
+ return [...listed, ["pts", dir()]];
14909
+ }
14910
+ };
14911
+ return new Proxy(fs, {
14912
+ get(target, key, receiver) {
14913
+ if (Object.hasOwn(over, key)) return over[key];
14914
+ const value2 = Reflect.get(target, key, receiver);
14915
+ return typeof value2 === "function" ? value2.bind(target) : value2;
14916
+ }
14917
+ });
14918
+ }
14919
+ var PTS, PTS_ENTRY;
14920
+ var init_wasi_ptsfs = __esm({
14921
+ "src/process/wasi/wasi-ptsfs.ts"() {
14922
+ "use strict";
14923
+ init_sync_fs_wire();
14924
+ init_js_dev();
14925
+ PTS = "/dev/pts";
14926
+ PTS_ENTRY = /^\/dev\/pts\/(\d+)$/;
14927
+ }
14928
+ });
14929
+
14796
14930
  // src/process/wasi/wasi-signals.ts
14797
14931
  var DELIVERED_MASK, KERNEL_DEFAULTS, LIBC_DEFAULT_EXIT, SA_RESTART, SA_NODEFER, SA_NOCLDWAIT, DISPOSITION_IGNORE, DISPOSITION_HANDLER, withBit, WASIX_LIBC_DEFAULT_LINE, WasiSignals;
14798
14932
  var init_wasi_signals = __esm({
@@ -16968,13 +17102,20 @@ async function runWasiProcess(init, port3) {
16968
17102
  ppid: id.ppid,
16969
17103
  parent: () => identify(transport, init).ppid,
16970
17104
  kernel: { sys: traced(stats, "kernel", sys), call: call2 },
16971
- fs: procfsBridge(
16972
- cachingBridge(
16973
- traced(stats, "fs", createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true })),
16974
- void 0,
16975
- threads?.ids
17105
+ fs: ptsBridge(
17106
+ procfsBridge(
17107
+ cachingBridge(
17108
+ traced(
17109
+ stats,
17110
+ "fs",
17111
+ createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true })
17112
+ ),
17113
+ void 0,
17114
+ threads?.ids
17115
+ ),
17116
+ procTree(call2, id.pid)
16976
17117
  ),
16977
- procTree(call2, id.pid)
17118
+ call2
16978
17119
  ),
16979
17120
  ...descriptors(init, fork, threads),
16980
17121
  ...threads ? { credGen: threads.ids } : {}
@@ -17074,13 +17215,16 @@ async function runWasiThread(init, port3) {
17074
17215
  ppid: id.ppid,
17075
17216
  parent: () => identify(transport, init).ppid,
17076
17217
  kernel: { sys, call: call2 },
17077
- fs: procfsBridge(
17078
- cachingBridge(
17079
- createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true }),
17080
- void 0,
17081
- threads.ids
17218
+ fs: ptsBridge(
17219
+ procfsBridge(
17220
+ cachingBridge(
17221
+ createSyncFsSabBridge(transport, { ...ownersOf(init), direct: true }),
17222
+ void 0,
17223
+ threads.ids
17224
+ ),
17225
+ procTree(call2, id.pid)
17082
17226
  ),
17083
- procTree(call2, id.pid)
17227
+ call2
17084
17228
  ),
17085
17229
  shared: threads.ids
17086
17230
  });
@@ -17146,6 +17290,7 @@ var init_wasi_runtime = __esm({
17146
17290
  init_wasi_imports();
17147
17291
  init_wasi_module();
17148
17292
  init_wasi_procfs();
17293
+ init_wasi_ptsfs();
17149
17294
  init_wasi_sigmask();
17150
17295
  init_wasi_signals();
17151
17296
  init_wasi_stats();