@ai-ecoverse/slicc-kernel 1.56.2 → 1.57.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.
@@ -786,6 +786,7 @@ function createNodeOps(h) {
786
786
  return {
787
787
  getattr(node) {
788
788
  const st = statOf(node);
789
+ const owned = bridgeOf(node).owners === true;
789
790
  const s = node.live;
790
791
  const size = Fs.isDir(node.mode) ? 4096 : s.ranged?.size() ?? (s.loaded ? s.len : st.size);
791
792
  const mtime = new Date(st.mtimeMs ?? 0);
@@ -794,8 +795,8 @@ function createNodeOps(h) {
794
795
  ino: st.ino ?? inodeOf(liveNodePath(node)),
795
796
  mode: node.mode,
796
797
  nlink: 1,
797
- uid: 0,
798
- gid: 0,
798
+ uid: owned ? st.uid ?? 0 : 0,
799
+ gid: owned ? st.gid ?? 0 : 0,
799
800
  rdev: 0,
800
801
  size,
801
802
  atime: new Date(st.atimeMs ?? mtime.getTime()),
@@ -838,14 +839,17 @@ function createNodeOps(h) {
838
839
  mknod(parent, name2, mode) {
839
840
  parent.live.listed = void 0;
840
841
  const path = childPath(parent, name2);
841
- if (Fs.isDir(mode)) {
842
- call2(() => bridgeOf(parent).mkdir(path));
843
- const perm = mode & PERM_MASK & ~UMASK;
844
- if (perm !== DEFAULT_DIR_PERM) metadataCall(() => bridgeOf(parent).chmod(path, perm));
842
+ const bridge = bridgeOf(parent);
843
+ const perm = bridge.owners ? mode & PERM_MASK : void 0;
844
+ if (Fs.isDir(mode) && perm !== void 0) {
845
+ call2(() => bridge.mkdir(path, perm));
846
+ } else if (Fs.isDir(mode)) {
847
+ call2(() => bridge.mkdir(path));
848
+ const masked = mode & PERM_MASK & ~UMASK;
849
+ if (masked !== DEFAULT_DIR_PERM) metadataCall(() => bridge.chmod(path, masked));
845
850
  } else if (Fs.isFile(mode)) {
846
- const bridge = bridgeOf(parent);
847
851
  call2(
848
- () => bridge.create ? bridge.create(path) : bridge.writeFile(path, new Uint8Array(0))
852
+ () => bridge.create ? bridge.create(path, perm) : bridge.writeFile(path, new Uint8Array(0))
849
853
  );
850
854
  } else {
851
855
  throw new Fs.ErrnoError(wasiErrno("EPERM"));
@@ -1248,6 +1252,32 @@ function guardRenames(Fs) {
1248
1252
  rename(from, to);
1249
1253
  };
1250
1254
  }
1255
+ function idOf(value2) {
1256
+ return value2 === -1 || value2 === 4294967295 ? void 0 : value2 >>> 0;
1257
+ }
1258
+ function useLiveChown(Fs) {
1259
+ const chown = Fs.chown?.bind(Fs);
1260
+ if (!chown) return;
1261
+ Fs.chown = (path, uid, gid, dontFollow) => {
1262
+ const node = typeof path === "string" ? Fs.lookupPath(path, { follow: !dontFollow }).node : path;
1263
+ if (!node.live || node.live.orphan) return chown(path, uid, gid, dontFollow);
1264
+ try {
1265
+ node.mount.opts.bridge.chown?.(liveNodePath(node), idOf(uid), idOf(gid));
1266
+ } catch (err) {
1267
+ throw toErrno(Fs, err);
1268
+ }
1269
+ node.live.stat = void 0;
1270
+ if (node.parent?.live) node.parent.live.listed = void 0;
1271
+ };
1272
+ const { getStreamChecked } = Fs;
1273
+ if (!Fs.fchown || !getStreamChecked) return;
1274
+ Fs.fchown = (fd, uid, gid) => {
1275
+ const stream = getStreamChecked.call(Fs, fd);
1276
+ const live = stream.node.live !== void 0;
1277
+ const target = live || stream.path === void 0 ? stream.node : stream.path;
1278
+ Fs.chown(target, uid, gid);
1279
+ };
1280
+ }
1251
1281
  var S_IFDIR, S_IFREG, S_IFLNK, PERM_MASK, DEFAULT_DIR_PERM, UMASK, SEEK_CUR, SEEK_END, EARLY_WHOLE_FILE;
1252
1282
  var init_live_vfs_fs = __esm({
1253
1283
  "src/realm/live-vfs-fs.ts"() {
@@ -1292,6 +1322,7 @@ function mountVfsIntoEmscripten(Fs, deps) {
1292
1322
  const dirs = topLevelDirs(bridge, warn);
1293
1323
  const { plugin, mounted } = mountLiveVfsDirs(Fs, bridge, dirs ?? [], warn);
1294
1324
  if (dirs) liveRoot(Fs, bridge);
1325
+ if (bridge.owners && Fs.lookupPath) useLiveChown(Fs);
1295
1326
  try {
1296
1327
  Fs.chdir(deps.cwd);
1297
1328
  } catch (err) {
@@ -1342,7 +1373,9 @@ function parseSyncFsStat(json) {
1342
1373
  ...s.readonly === true ? { readonly: true } : {},
1343
1374
  ...typeof s.maxFile === "number" ? { maxFile: s.maxFile } : {},
1344
1375
  ...s.ranged === true ? { ranged: true } : {},
1345
- ...typeof s.version === "string" ? { version: s.version } : {}
1376
+ ...typeof s.version === "string" ? { version: s.version } : {},
1377
+ ...typeof s.uid === "number" ? { uid: s.uid } : {},
1378
+ ...typeof s.gid === "number" ? { gid: s.gid } : {}
1346
1379
  };
1347
1380
  }
1348
1381
  var SYNC_FS_OPS, SYNC_FS_REQUEST_TIMEOUT_MS;
@@ -1373,7 +1406,9 @@ var init_sync_fs_wire = __esm({
1373
1406
  "kept",
1374
1407
  "pread",
1375
1408
  "pwrite",
1376
- "truncate"
1409
+ "truncate",
1410
+ "chown",
1411
+ "lchown"
1377
1412
  ];
1378
1413
  SYNC_FS_REQUEST_TIMEOUT_MS = 25e3;
1379
1414
  }
@@ -1595,8 +1630,8 @@ function createSyncFsSabBridge(transport, opts = {}) {
1595
1630
  if (typeof v !== "boolean") throw errnoError("EIO", path);
1596
1631
  return v;
1597
1632
  },
1598
- mkdir: (path) => {
1599
- run({ op: "mkdir", path }, path);
1633
+ mkdir: (path, mode) => {
1634
+ run({ op: "mkdir", path, ...mode !== void 0 ? { mode } : {} }, path);
1600
1635
  },
1601
1636
  rm: (path) => {
1602
1637
  run({ op: "rm", path }, path);
@@ -1627,9 +1662,14 @@ function createSyncFsSabBridge(transport, opts = {}) {
1627
1662
  lutimes: (path, atimeMs, mtimeMs) => {
1628
1663
  run({ op: "lutimes", path, atimeMs, mtimeMs }, path);
1629
1664
  },
1630
- create: (path) => {
1631
- run({ op: "create", path }, path);
1665
+ create: (path, mode) => {
1666
+ run({ op: "create", path, ...mode !== void 0 ? { mode } : {} }, path);
1632
1667
  },
1668
+ chown: (path, uid, gid) => {
1669
+ const ids = { ...uid !== void 0 ? { uid } : {}, ...gid !== void 0 ? { gid } : {} };
1670
+ run({ op: "lchown", path, ...ids }, path);
1671
+ },
1672
+ ...opts.owners ? { owners: true } : {},
1633
1673
  hold: (path, held, open, handle) => {
1634
1674
  const mode = (held ? 1 : 0) | (open ? 2 : 0);
1635
1675
  if (mode === 3) return json({ op: "hold", path, mode }, path);
@@ -4049,6 +4089,9 @@ function reportGrowth(imports, publish) {
4049
4089
  return grown;
4050
4090
  };
4051
4091
  }
4092
+ function callerOwner(Fs, init) {
4093
+ return init.owners ? {} : { owner: ownByCaller(Fs, init.cred, credAbi(init.program.glue)) };
4094
+ }
4052
4095
  async function runWasmProcess(init, port2, deps = {}) {
4053
4096
  const signals = new SignalGate(
4054
4097
  createSyncSabTransport(init.sab, port2, {
@@ -4159,7 +4202,7 @@ async function runWasmProcess(init, port2, deps = {}) {
4159
4202
  const running = module;
4160
4203
  if (!hasStreams(running)) return runStdioOnly(running, init);
4161
4204
  const vfs = mountVfsIntoEmscripten(running.FS, {
4162
- bridge: createSyncFsSabBridge(transport),
4205
+ bridge: createSyncFsSabBridge(transport, init.owners ? { owners: true } : {}),
4163
4206
  cwd: init.cwd,
4164
4207
  warn: deps.warn ?? say(2)
4165
4208
  });
@@ -4201,7 +4244,7 @@ async function runWasmProcess(init, port2, deps = {}) {
4201
4244
  describeFork: () => describeForFork(running.FS, sys, streams, livePath),
4202
4245
  inherit: (actions) => describeInherited(running.FS, sys, streams, livePath, actions),
4203
4246
  stdioPromoter: () => vfsPromoter(running.FS, sys, streams, livePath),
4204
- owner: ownByCaller(running.FS, init.cred, credAbi(init.program.glue))
4247
+ ...callerOwner(running.FS, init)
4205
4248
  });
4206
4249
  running.sliccKernel.http = createHttpKernel(transport);
4207
4250
  running.sliccKernel.hostname = hostnameOf(init.env);