@ai-ecoverse/slicc-kernel 1.103.0 → 1.103.2
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.
- package/README.md +3 -3
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +146 -31
- package/dist/kernel-worker.js.map +4 -4
- package/dist/meta.js.map +2 -2
- package/dist/node-process-worker.js +39 -46
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +151 -36
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +54 -61
- package/dist/process-worker.js.map +3 -3
- package/dist/types/fs/meta.d.ts +1 -0
- package/dist/types/fs/types.d.ts +2 -0
- package/dist/types/kernel/children.d.ts +1 -0
- package/dist/types/kernel/process.d.ts +1 -0
- package/dist/types/kernel/run-child.d.ts +1 -0
- package/dist/types/kernel/socket-nodes.d.ts +20 -0
- package/dist/types/kernel/socket-syscalls.d.ts +2 -0
- package/dist/types/kernel/socket.d.ts +11 -5
- package/dist/types/launcher.d.ts +1 -0
- package/dist/types/realm/emscripten-vfs-hook.d.ts +1 -0
- package/dist/types/realm/sync-fs-dispatch.d.ts +1 -0
- package/dist/types/realm/sync-fs-wire.d.ts +1 -0
- package/package.json +3 -3
package/dist/node.js
CHANGED
|
@@ -1549,6 +1549,7 @@ var KernelSocket = class _KernelSocket {
|
|
|
1549
1549
|
queue = [];
|
|
1550
1550
|
backlog = 0;
|
|
1551
1551
|
boundAt;
|
|
1552
|
+
named;
|
|
1552
1553
|
changes = new Changes();
|
|
1553
1554
|
room = new Changes();
|
|
1554
1555
|
options = /* @__PURE__ */ new Map();
|
|
@@ -1614,10 +1615,13 @@ var KernelSocket = class _KernelSocket {
|
|
|
1614
1615
|
for (const wait2 of waits) wait2.catch(() => void 0);
|
|
1615
1616
|
return pipeCall(() => Promise.race(waits));
|
|
1616
1617
|
}
|
|
1617
|
-
|
|
1618
|
+
bindable(addr) {
|
|
1618
1619
|
if (this.state !== "open" || this.local) throw new KernelError("EINVAL");
|
|
1619
1620
|
if (addr.family !== this.domain) throw new KernelError("EAFNOSUPPORT");
|
|
1620
|
-
|
|
1621
|
+
}
|
|
1622
|
+
bind(addr, kernel = false, name2) {
|
|
1623
|
+
this.bindable(addr);
|
|
1624
|
+
this.local = this.net.bind(this, addr, kernel, name2);
|
|
1621
1625
|
this.boundAt = this.local;
|
|
1622
1626
|
}
|
|
1623
1627
|
listen(backlog, cred) {
|
|
@@ -1655,7 +1659,7 @@ var KernelSocket = class _KernelSocket {
|
|
|
1655
1659
|
waitRoom(signal) {
|
|
1656
1660
|
return this.room.wait(signal);
|
|
1657
1661
|
}
|
|
1658
|
-
connect(addr, viaUplink = true, cred, stamp, waits = true) {
|
|
1662
|
+
connect(addr, viaUplink = true, cred, stamp, waits = true, name2) {
|
|
1659
1663
|
if (this.state === "connected") throw new KernelError("EISCONN");
|
|
1660
1664
|
if (this.state === "connecting") throw new KernelError("EALREADY");
|
|
1661
1665
|
if (this.state !== "open") throw new KernelError("EINVAL");
|
|
@@ -1663,7 +1667,7 @@ var KernelSocket = class _KernelSocket {
|
|
|
1663
1667
|
this.failed = void 0;
|
|
1664
1668
|
const route = viaUplink && addr.family === "inet" ? this.net.uplinkFor(addr.host) : void 0;
|
|
1665
1669
|
if (route) return this.dial(addr, route);
|
|
1666
|
-
const target = this.net.target(addr);
|
|
1670
|
+
const target = this.net.target(addr, name2);
|
|
1667
1671
|
if (!this.local) {
|
|
1668
1672
|
if (addr.family === "inet") {
|
|
1669
1673
|
this.local = this.net.bind(this, { family: "inet", host: "127.0.0.1", port: 0 });
|
|
@@ -1824,7 +1828,7 @@ var KernelSocket = class _KernelSocket {
|
|
|
1824
1828
|
this.readShut = true;
|
|
1825
1829
|
this.writeShut = true;
|
|
1826
1830
|
}
|
|
1827
|
-
if (this.boundAt) this.net.release(this.boundAt, this);
|
|
1831
|
+
if (this.boundAt) this.net.release(this.boundAt, this, this.named);
|
|
1828
1832
|
this.boundAt = void 0;
|
|
1829
1833
|
this.changes.wake();
|
|
1830
1834
|
}
|
|
@@ -1841,7 +1845,8 @@ var KernelSocket = class _KernelSocket {
|
|
|
1841
1845
|
function canonicalHost(host) {
|
|
1842
1846
|
return host === "0.0.0.0" ? "127.0.0.1" : host;
|
|
1843
1847
|
}
|
|
1844
|
-
function keyOf(addr) {
|
|
1848
|
+
function keyOf(addr, name2) {
|
|
1849
|
+
if (name2) return `node:${name2.key}`;
|
|
1845
1850
|
return addr.family === "inet" ? `inet:${addr.port}` : `unix:${addr.path}`;
|
|
1846
1851
|
}
|
|
1847
1852
|
var LOCAL_ONLY = new Routes();
|
|
@@ -1920,28 +1925,30 @@ var LoopbackNet = class {
|
|
|
1920
1925
|
void socket.connect(addr, false, void 0, void 0, false);
|
|
1921
1926
|
return socket;
|
|
1922
1927
|
}
|
|
1923
|
-
bind(socket, addr, kernel = false) {
|
|
1928
|
+
bind(socket, addr, kernel = false, name2) {
|
|
1924
1929
|
if (addr.family === "unix") {
|
|
1925
1930
|
if (addr.path === "") throw new KernelError("EINVAL");
|
|
1926
1931
|
} else this.bindable(addr, kernel);
|
|
1927
1932
|
const named = addr.family === "inet" && addr.port === 0 ? { ...addr, port: this.ephemeral() } : addr;
|
|
1928
|
-
const key = keyOf(named);
|
|
1929
|
-
if (this.bound.has(key)) throw new KernelError("EADDRINUSE");
|
|
1933
|
+
const key = keyOf(named, name2);
|
|
1934
|
+
if (this.bound.has(key) && !name2) throw new KernelError("EADDRINUSE");
|
|
1930
1935
|
this.bound.set(key, socket);
|
|
1936
|
+
socket.named = name2;
|
|
1931
1937
|
return named;
|
|
1932
1938
|
}
|
|
1933
|
-
release(addr, socket) {
|
|
1934
|
-
const key = keyOf(addr);
|
|
1939
|
+
release(addr, socket, name2) {
|
|
1940
|
+
const key = keyOf(addr, name2);
|
|
1935
1941
|
if (this.bound.get(key) === socket) this.bound.delete(key);
|
|
1936
1942
|
}
|
|
1937
|
-
target(addr) {
|
|
1943
|
+
target(addr, name2) {
|
|
1938
1944
|
if (addr.family === "inet" && !isLoopback(canonicalHost(addr.host))) {
|
|
1939
1945
|
throw new KernelError("ENETUNREACH");
|
|
1940
1946
|
}
|
|
1941
|
-
const key = keyOf(addr);
|
|
1947
|
+
const key = keyOf(addr, name2);
|
|
1942
1948
|
if (!this.bound.has(key)) this.activators.get(key)?.();
|
|
1943
1949
|
const socket = this.bound.get(key);
|
|
1944
1950
|
if (!socket?.listening) throw new KernelError("ECONNREFUSED");
|
|
1951
|
+
if (name2 && socket.named?.typed && !name2.typed) throw new KernelError("ECONNREFUSED");
|
|
1945
1952
|
return socket;
|
|
1946
1953
|
}
|
|
1947
1954
|
ephemeral() {
|
|
@@ -4016,6 +4023,7 @@ function view(target, overrides) {
|
|
|
4016
4023
|
var S_IFDIR = 16384;
|
|
4017
4024
|
var S_IFREG = 32768;
|
|
4018
4025
|
var S_IFLNK = 40960;
|
|
4026
|
+
var S_IFSOCK = 49152;
|
|
4019
4027
|
var PERM_MASK = 4095;
|
|
4020
4028
|
var S_ISGID3 = 1024;
|
|
4021
4029
|
var READ_ATTEMPTS = 3;
|
|
@@ -4279,7 +4287,8 @@ var OpfsFs = class {
|
|
|
4279
4287
|
return Object.keys(fields).length > 0 ? fields : void 0;
|
|
4280
4288
|
}
|
|
4281
4289
|
async stampNew(path, owner, directory) {
|
|
4282
|
-
const
|
|
4290
|
+
const owned4 = await this.newFields(path, owner, directory);
|
|
4291
|
+
const fields = owner?.socket && !directory ? { ...owned4, socket: true } : owned4;
|
|
4283
4292
|
if (fields) await this.meta.update(path, (entry) => ({ ...entry, path, ...fields }));
|
|
4284
4293
|
}
|
|
4285
4294
|
guarded = [];
|
|
@@ -4479,7 +4488,8 @@ var OpfsFs = class {
|
|
|
4479
4488
|
}
|
|
4480
4489
|
mode(path, directory, meta) {
|
|
4481
4490
|
const fallback = directory || EXECUTABLE.test(path) ? 493 : 420;
|
|
4482
|
-
|
|
4491
|
+
const type = directory ? S_IFDIR : meta?.socket ? S_IFSOCK : S_IFREG;
|
|
4492
|
+
return type | (meta?.mode ?? fallback);
|
|
4483
4493
|
}
|
|
4484
4494
|
id = crypto.randomUUID();
|
|
4485
4495
|
dirTimes = /* @__PURE__ */ new Map();
|
|
@@ -4558,10 +4568,12 @@ var OpfsFs = class {
|
|
|
4558
4568
|
const modified = file?.lastModified ?? 0;
|
|
4559
4569
|
const kept = meta?.mtimeMs !== void 0 && meta.mtimeFor === modified ? meta.mtimeMs : modified;
|
|
4560
4570
|
const mtime = touched ?? kept;
|
|
4571
|
+
const socket = !directory && meta?.socket === true;
|
|
4561
4572
|
return {
|
|
4562
|
-
isFile: !directory,
|
|
4573
|
+
isFile: !directory && !socket,
|
|
4563
4574
|
isDirectory: directory,
|
|
4564
4575
|
isSymbolicLink: false,
|
|
4576
|
+
...socket ? { isSocket: true } : {},
|
|
4565
4577
|
size: file?.size ?? 0,
|
|
4566
4578
|
mode: this.mode(path, directory, meta),
|
|
4567
4579
|
mtime: new Date(mtime),
|
|
@@ -9793,6 +9805,7 @@ function statJson(s) {
|
|
|
9793
9805
|
isDirectory: s.isDirectory,
|
|
9794
9806
|
isFile: s.isFile,
|
|
9795
9807
|
isSymbolicLink: s.isSymbolicLink,
|
|
9808
|
+
...s.isSocket ? { isSocket: true } : {},
|
|
9796
9809
|
size: s.size,
|
|
9797
9810
|
mode: s.mode,
|
|
9798
9811
|
mtimeMs: s.mtime.getTime(),
|
|
@@ -11177,7 +11190,7 @@ var PATH_OPS = new Set(SYNC_FS_OPS);
|
|
|
11177
11190
|
var EARLY_WHOLE_FILE = 64 * 1024;
|
|
11178
11191
|
|
|
11179
11192
|
// src/version.ts
|
|
11180
|
-
var KERNEL_VERSION = true ? "1.103.
|
|
11193
|
+
var KERNEL_VERSION = true ? "1.103.2" : "0.0.0-dev";
|
|
11181
11194
|
var OS_RELEASE = "6.0.0-slicc";
|
|
11182
11195
|
function procVersion() {
|
|
11183
11196
|
return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
|
|
@@ -14261,6 +14274,7 @@ async function runChild(req, deps) {
|
|
|
14261
14274
|
...req.argv0 !== void 0 ? { argv0: req.argv0 } : {},
|
|
14262
14275
|
env: req.env,
|
|
14263
14276
|
cwd: req.cwd,
|
|
14277
|
+
...req.chdir ? { chdir: req.chdir } : {},
|
|
14264
14278
|
...req.pgid !== void 0 ? { pgid: req.pgid } : {},
|
|
14265
14279
|
...req.session ? { session: req.session } : {}
|
|
14266
14280
|
},
|
|
@@ -14546,6 +14560,47 @@ async function semSyscall(req, proc) {
|
|
|
14546
14560
|
}
|
|
14547
14561
|
}
|
|
14548
14562
|
|
|
14563
|
+
// src/kernel/socket-nodes.ts
|
|
14564
|
+
function filePath(addr) {
|
|
14565
|
+
if (addr.family !== "unix" || addr.path === "" || addr.path.startsWith("\0")) return void 0;
|
|
14566
|
+
return normalizePath(addr.path);
|
|
14567
|
+
}
|
|
14568
|
+
function nameOf(st) {
|
|
14569
|
+
return { key: `${st.dev ?? 0}:${st.ino}`, typed: st.isSocket === true };
|
|
14570
|
+
}
|
|
14571
|
+
function codeOf3(err) {
|
|
14572
|
+
return err?.code;
|
|
14573
|
+
}
|
|
14574
|
+
function socketNames(deps) {
|
|
14575
|
+
const { fs } = deps;
|
|
14576
|
+
return {
|
|
14577
|
+
async make(path) {
|
|
14578
|
+
const g = deps.guard();
|
|
14579
|
+
if (g) await inParent(g, "bind", path);
|
|
14580
|
+
const owner = deps.owner();
|
|
14581
|
+
try {
|
|
14582
|
+
await deps.create(path, owner);
|
|
14583
|
+
} catch (err) {
|
|
14584
|
+
if (codeOf3(err) === "EEXIST") throw new KernelError("EADDRINUSE");
|
|
14585
|
+
throw err;
|
|
14586
|
+
}
|
|
14587
|
+
const remove = () => fs.rm(path, { file: true }).catch(() => void 0);
|
|
14588
|
+
try {
|
|
14589
|
+
if (!deps.owners && owner.mode !== void 0) await fs.chmod(path, owner.mode);
|
|
14590
|
+
return { ...nameOf(await fs.lstat(path)), remove };
|
|
14591
|
+
} catch (err) {
|
|
14592
|
+
await remove();
|
|
14593
|
+
throw err;
|
|
14594
|
+
}
|
|
14595
|
+
},
|
|
14596
|
+
async find(path) {
|
|
14597
|
+
const g = deps.guard();
|
|
14598
|
+
if (g) await need(g, "connect", path, W_OK, { directory: false });
|
|
14599
|
+
return nameOf(await fs.stat(path));
|
|
14600
|
+
}
|
|
14601
|
+
};
|
|
14602
|
+
}
|
|
14603
|
+
|
|
14549
14604
|
// src/kernel/net/datagram-wire.ts
|
|
14550
14605
|
function encodeReceived(got) {
|
|
14551
14606
|
const host = new TextEncoder().encode(got.host);
|
|
@@ -14612,7 +14667,7 @@ async function socketSyscall(req, proc) {
|
|
|
14612
14667
|
}
|
|
14613
14668
|
}
|
|
14614
14669
|
case "sock-bind":
|
|
14615
|
-
|
|
14670
|
+
await bind(proc, req.fd, req.addr);
|
|
14616
14671
|
return ok3();
|
|
14617
14672
|
case "sock-listen":
|
|
14618
14673
|
socketAt(fds, req.fd).listen(req.backlog, proc.cred?.());
|
|
@@ -14650,8 +14705,10 @@ async function connect(req, proc) {
|
|
|
14650
14705
|
target.connectTo(req.addr);
|
|
14651
14706
|
return ok3();
|
|
14652
14707
|
}
|
|
14708
|
+
const path = filePath(req.addr);
|
|
14709
|
+
const name2 = path !== void 0 ? await proc.names?.find(path) : void 0;
|
|
14653
14710
|
const stamp = proc.net.facadeAt(req.addr) && await proc.stamp?.();
|
|
14654
|
-
const dialing = target.connect(req.addr, true, proc.cred?.(), stamp || void 0);
|
|
14711
|
+
const dialing = target.connect(req.addr, true, proc.cred?.(), stamp || void 0, true, name2);
|
|
14655
14712
|
if (req.nonblock) {
|
|
14656
14713
|
dialing?.catch(() => void 0);
|
|
14657
14714
|
throw new KernelError("EINPROGRESS");
|
|
@@ -14659,6 +14716,22 @@ async function connect(req, proc) {
|
|
|
14659
14716
|
if (dialing !== void 0) await interruptible2(dialing, proc.blocking());
|
|
14660
14717
|
return ok3();
|
|
14661
14718
|
}
|
|
14719
|
+
async function bind(proc, fd, addr) {
|
|
14720
|
+
const socket = anySocketAt(proc.fds, fd);
|
|
14721
|
+
const path = filePath(addr);
|
|
14722
|
+
if (!(socket instanceof KernelSocket) || path === void 0 || !proc.names) {
|
|
14723
|
+
socket.bind(addr);
|
|
14724
|
+
return;
|
|
14725
|
+
}
|
|
14726
|
+
socket.bindable(addr);
|
|
14727
|
+
const name2 = await proc.names.make(path);
|
|
14728
|
+
try {
|
|
14729
|
+
socket.bind({ family: "unix", path }, false, name2);
|
|
14730
|
+
} catch (err) {
|
|
14731
|
+
await name2.remove();
|
|
14732
|
+
throw err;
|
|
14733
|
+
}
|
|
14734
|
+
}
|
|
14662
14735
|
async function datagram(req, proc) {
|
|
14663
14736
|
const dgram = dgramAt(proc.fds, req.fd);
|
|
14664
14737
|
if (req.op === "sock-sendto") {
|
|
@@ -15266,6 +15339,11 @@ function heldIo(fs, nodes, changed) {
|
|
|
15266
15339
|
const held = st.isFile ? await node(path) : void 0;
|
|
15267
15340
|
return held ? { ...st, size: await held.serial(() => held.size()) } : st;
|
|
15268
15341
|
},
|
|
15342
|
+
async lstat(path) {
|
|
15343
|
+
const st = await fs.lstat(path);
|
|
15344
|
+
const held = st.isFile && !st.isSymbolicLink ? await node(path) : void 0;
|
|
15345
|
+
return held ? { ...st, size: await held.serial(() => held.size()) } : st;
|
|
15346
|
+
},
|
|
15269
15347
|
async readFileBuffer(path) {
|
|
15270
15348
|
const held = await node(path);
|
|
15271
15349
|
if (!held) return fs.readFileBuffer(path);
|
|
@@ -15679,13 +15757,23 @@ var WasmProcess = class {
|
|
|
15679
15757
|
return "deliver";
|
|
15680
15758
|
}
|
|
15681
15759
|
async spawn(req) {
|
|
15682
|
-
const { file, argv, argv0, env, cwd, stdio, inherit: inherit2, exec, pgid, session, deathSignal } = req;
|
|
15760
|
+
const { file, argv, argv0, env, cwd, chdir, stdio, inherit: inherit2, exec, pgid, session, deathSignal } = req;
|
|
15683
15761
|
if (deathSignal !== void 0 && (exec || !isSignal(deathSignal))) {
|
|
15684
15762
|
throw new KernelError("EINVAL");
|
|
15685
15763
|
}
|
|
15686
15764
|
const group = { ...pgid !== void 0 ? { pgid } : {}, ...session ? { session } : {} };
|
|
15687
15765
|
const named = argv0 !== void 0 ? { argv0 } : {};
|
|
15688
|
-
const
|
|
15766
|
+
const moved2 = chdir ? { chdir } : {};
|
|
15767
|
+
const spawned = {
|
|
15768
|
+
file,
|
|
15769
|
+
argv,
|
|
15770
|
+
...named,
|
|
15771
|
+
env,
|
|
15772
|
+
cwd,
|
|
15773
|
+
...moved2,
|
|
15774
|
+
...group,
|
|
15775
|
+
...exec ? { exec } : {}
|
|
15776
|
+
};
|
|
15689
15777
|
const pid = await this.children.spawn(spawned, stdio, inherit2);
|
|
15690
15778
|
if (deathSignal !== void 0) this.onDeath(pgid === 0 || session ? -pid : pid, deathSignal);
|
|
15691
15779
|
if (!exec) return pid;
|
|
@@ -16552,7 +16640,19 @@ var WasmProcess = class {
|
|
|
16552
16640
|
blocking: () => this.blockingSignal(cancelled),
|
|
16553
16641
|
resolve: (name2, family, blocking) => resolver.resolve(name2, family, blocking),
|
|
16554
16642
|
cred: () => ({ pid: this.pid, uid: this.cred.euid, gid: this.cred.egid }),
|
|
16555
|
-
stamp: () => this.connectorStamp()
|
|
16643
|
+
stamp: () => this.connectorStamp(),
|
|
16644
|
+
names: socketNames({
|
|
16645
|
+
fs: this.heldFs(),
|
|
16646
|
+
guard: () => this.guarded(),
|
|
16647
|
+
create: (path, owner) => this.nodes.createExclusive(path, owner),
|
|
16648
|
+
owner: () => ({
|
|
16649
|
+
uid: this.cred.euid,
|
|
16650
|
+
gid: this.cred.egid,
|
|
16651
|
+
mode: 511 & ~this.umask,
|
|
16652
|
+
socket: true
|
|
16653
|
+
}),
|
|
16654
|
+
owners: this.options.owners === true
|
|
16655
|
+
})
|
|
16556
16656
|
});
|
|
16557
16657
|
}
|
|
16558
16658
|
tty(fd) {
|
|
@@ -18626,8 +18726,8 @@ var FSA_CAPABILITIES = {
|
|
|
18626
18726
|
ranges: true,
|
|
18627
18727
|
sessions: true
|
|
18628
18728
|
};
|
|
18629
|
-
var
|
|
18630
|
-
var denied = (err) =>
|
|
18729
|
+
var codeOf4 = (err) => err?.code;
|
|
18730
|
+
var denied = (err) => codeOf4(err) === "EACCES" || err?.name === "NotAllowedError";
|
|
18631
18731
|
function attrOf(st) {
|
|
18632
18732
|
return {
|
|
18633
18733
|
kind: st.isDirectory ? "directory" : st.isSymbolicLink ? "symlink" : "file",
|
|
@@ -18649,7 +18749,7 @@ function kernelFsHandlers(fs) {
|
|
|
18649
18749
|
try {
|
|
18650
18750
|
return await fs.stat(path);
|
|
18651
18751
|
} catch (err) {
|
|
18652
|
-
if (
|
|
18752
|
+
if (codeOf4(err) === "ENOENT") return void 0;
|
|
18653
18753
|
throw err;
|
|
18654
18754
|
}
|
|
18655
18755
|
}
|
|
@@ -18842,7 +18942,7 @@ function parseFstab(text) {
|
|
|
18842
18942
|
});
|
|
18843
18943
|
return lines2;
|
|
18844
18944
|
}
|
|
18845
|
-
function
|
|
18945
|
+
function codeOf5(err) {
|
|
18846
18946
|
const code = err?.code;
|
|
18847
18947
|
return typeof code === "string" ? code : "EIO";
|
|
18848
18948
|
}
|
|
@@ -18880,18 +18980,18 @@ async function mountLine({ line, spec, invalid }, mount, signal, retries, discar
|
|
|
18880
18980
|
break;
|
|
18881
18981
|
} catch (err) {
|
|
18882
18982
|
failed3 = err;
|
|
18883
|
-
if (FINAL.has(
|
|
18983
|
+
if (FINAL.has(codeOf5(err)) || attempt === retries.length) break;
|
|
18884
18984
|
await wait(retries[attempt], signal);
|
|
18885
18985
|
}
|
|
18886
18986
|
}
|
|
18887
|
-
const code =
|
|
18987
|
+
const code = codeOf5(failed3);
|
|
18888
18988
|
return { line, target: spec.target, code, error: String(failed3?.message ?? code) };
|
|
18889
18989
|
}
|
|
18890
18990
|
|
|
18891
18991
|
// src/mount/hostfs.ts
|
|
18892
18992
|
var HOSTFS_IO = 16 * 1024 * 1024;
|
|
18893
|
-
var
|
|
18894
|
-
var unreachable = (err) =>
|
|
18993
|
+
var codeOf6 = (err) => err?.code;
|
|
18994
|
+
var unreachable = (err) => codeOf6(err) === "ENOTCONN";
|
|
18895
18995
|
function rel(path) {
|
|
18896
18996
|
return path.replace(/^\/+/, "");
|
|
18897
18997
|
}
|
|
@@ -19068,7 +19168,7 @@ function hostfsHandlers(current, againMs = RESTORE_AGAIN_MS) {
|
|
|
19068
19168
|
try {
|
|
19069
19169
|
return { opened: await opening2(), restore: void 0 };
|
|
19070
19170
|
} catch (err) {
|
|
19071
|
-
if (!flags2.write ||
|
|
19171
|
+
if (!flags2.write || codeOf6(err) !== "EACCES") throw err;
|
|
19072
19172
|
const was = await client.call("stat", { path: rel(path) });
|
|
19073
19173
|
const mode = was.mode ?? 0;
|
|
19074
19174
|
if (mode & 128) throw err;
|
|
@@ -19493,7 +19593,7 @@ var PortTransport = class {
|
|
|
19493
19593
|
}
|
|
19494
19594
|
};
|
|
19495
19595
|
var errorOf = (err) => ({
|
|
19496
|
-
code: typeof
|
|
19596
|
+
code: typeof codeOf6(err) === "string" ? codeOf6(err) : "EIO",
|
|
19497
19597
|
message: err?.message ?? String(err)
|
|
19498
19598
|
});
|
|
19499
19599
|
function serveHostfsPort(port, transport) {
|
|
@@ -21192,6 +21292,13 @@ var Launcher = class {
|
|
|
21192
21292
|
await fds.closeAll();
|
|
21193
21293
|
throw new SpawnError(await this.unrunnable(file, req.cwd, scope));
|
|
21194
21294
|
}
|
|
21295
|
+
async enterable(g, cwd) {
|
|
21296
|
+
if (!g) return;
|
|
21297
|
+
const denied2 = new Error(`cannot change to ${cwd}: Permission denied`);
|
|
21298
|
+
await need(g, "chdir", cwd, X_OK, { directory: true }).catch((err) => {
|
|
21299
|
+
throw err.code === "EACCES" ? Object.assign(denied2, { code: "EACCES" }) : err;
|
|
21300
|
+
});
|
|
21301
|
+
}
|
|
21195
21302
|
execGuard(cred, pid, tag) {
|
|
21196
21303
|
const { dac } = this;
|
|
21197
21304
|
return dac && { fs: this.fs, cred, pid, dac, tag, links: this.links.get(pid) };
|
|
@@ -21808,6 +21915,13 @@ var Launcher = class {
|
|
|
21808
21915
|
throw new SpawnError(group);
|
|
21809
21916
|
}
|
|
21810
21917
|
const cred = grant ? grant.cred : this.credOf(ppid);
|
|
21918
|
+
if (req.chdir && !grant) {
|
|
21919
|
+
const g = this.execGuard(cred, ppid);
|
|
21920
|
+
await this.enterable(g, req.cwd).catch(async (err) => {
|
|
21921
|
+
await fds.closeAll();
|
|
21922
|
+
throw err.code === "EACCES" ? new SpawnError("EACCES") : err;
|
|
21923
|
+
});
|
|
21924
|
+
}
|
|
21811
21925
|
const scope = grant ? "" : await this.scopeOf(cred.euid);
|
|
21812
21926
|
const file = booked === void 0 ? req.file : await this.ticketFile(req, fds);
|
|
21813
21927
|
const planned = await this.checkedPlan({ ...req, file }, { ppid, cred, scope }, fds);
|
|
@@ -22404,6 +22518,7 @@ var Launcher = class {
|
|
|
22404
22518
|
const scope = account.uid === 0 ? "" : pnpmHomeOf(account, this.pnpmHome);
|
|
22405
22519
|
const start2 = dir ?? "/";
|
|
22406
22520
|
const cwd = await physicalPathAsync(this.base, start2.startsWith("/") ? start2 : `/${start2}`);
|
|
22521
|
+
await this.enterable(this.execGuard(credOf(account), 0, tag), cwd);
|
|
22407
22522
|
const file = await this.execFile(argv[0] ?? "", cwd, this.execGuard(credOf(account), 0, tag));
|
|
22408
22523
|
if (!await this.base.exists(cwd)) await this.stackFor(tag).fs.mkdir(cwd, { recursive: true });
|
|
22409
22524
|
const planned = await this.plan(file, argv, cwd, scope);
|
|
@@ -22912,7 +23027,7 @@ import { connect as tls } from "node:tls";
|
|
|
22912
23027
|
var PROBE_MS = 3e3;
|
|
22913
23028
|
var PASSED = /* @__PURE__ */ new Set(["ECONNREFUSED", "EHOSTUNREACH", "ENETUNREACH", "ETIMEDOUT", "ECONNRESET"]);
|
|
22914
23029
|
var NO_NAME = /* @__PURE__ */ new Set(["ENOTFOUND", "EAI_AGAIN", "EAI_NONAME", "EAI_FAIL", "ENODATA"]);
|
|
22915
|
-
function
|
|
23030
|
+
function codeOf7(e) {
|
|
22916
23031
|
const code = e?.code;
|
|
22917
23032
|
return typeof code === "string" ? code : void 0;
|
|
22918
23033
|
}
|
|
@@ -22941,7 +23056,7 @@ function probe(secure, host, port, ms, signal) {
|
|
|
22941
23056
|
signal?.addEventListener("abort", stop, { once: true });
|
|
22942
23057
|
socket.once(secure ? "secureConnect" : "connect", () => done4("EPROTO"));
|
|
22943
23058
|
socket.once("error", (e) => {
|
|
22944
|
-
const code =
|
|
23059
|
+
const code = codeOf7(e) ?? "";
|
|
22945
23060
|
done4(PASSED.has(code) ? code : "EPROTO");
|
|
22946
23061
|
});
|
|
22947
23062
|
});
|
|
@@ -22956,7 +23071,7 @@ async function diagnose(url, ms = PROBE_MS, signal) {
|
|
|
22956
23071
|
await abortable(lookup3(host), signal);
|
|
22957
23072
|
} catch (e) {
|
|
22958
23073
|
if (signal?.aborted) throw signal.reason;
|
|
22959
|
-
return NO_NAME.has(
|
|
23074
|
+
return NO_NAME.has(codeOf7(e) ?? "") ? "EAI_NONAME" : void 0;
|
|
22960
23075
|
}
|
|
22961
23076
|
const code = await probe(secure, host, port, ms, signal);
|
|
22962
23077
|
signal?.throwIfAborted();
|
|
@@ -22975,7 +23090,7 @@ function diagnosing(transport, check = byDefault) {
|
|
|
22975
23090
|
try {
|
|
22976
23091
|
return await open(request);
|
|
22977
23092
|
} catch (e) {
|
|
22978
|
-
if (request.signal.aborted || !(e instanceof Error) ||
|
|
23093
|
+
if (request.signal.aborted || !(e instanceof Error) || codeOf7(e)) throw e;
|
|
22979
23094
|
const code = await abortable(
|
|
22980
23095
|
check(request.url, request.signal).catch(() => void 0),
|
|
22981
23096
|
request.signal
|