/** * Logical FD registry, sigaction, and snapshot-handle methods on kernel `ctx`. */ import { bareOsIsPosixSignalName, bareOsNormalizeSignalName } from './bare-os-posix-signals.js' export function createBareOsLogicalFdMethods() { return { /** * @param {number} fd * @param {string} target */ bareOsRegisterLogicalFd(fd, target) { const n = Number(fd) if (!Number.isFinite(n) || n < 0 || n > 65535) return const k = String(n >>> 0) if (k === '0' || k === '1' || k === '2') return this.bareOsLogicalFds[k] = String(target || '') }, /** @param {number} fd */ bareOsUnregisterLogicalFd(fd) { const k = String(Number(fd) >>> 0) if (this.bareOsLogicalFds && typeof this.bareOsLogicalFds === 'object') { delete this.bareOsLogicalFds[k] } if ( this.bareOsLogicalFdFlags && typeof this.bareOsLogicalFdFlags === 'object' ) { delete this.bareOsLogicalFdFlags[k] } }, /** * Logical `sigaction`: `IGNORE` suppresses synthetic delivery for this signal. * @param {string} signal * @param {'IGNORE' | 'DEFAULT' | 'IGN' | 'DEF'} mode */ bareOsSigaction(signal, mode) { const s = bareOsNormalizeSignalName(signal) if (!bareOsIsPosixSignalName(signal) || s === '0') { throw new Error('bareOsSigaction: unsupported signal') } const m = String(mode || 'DEFAULT') .toUpperCase() .replace(/^SIG/i, '') if (m === 'DEFAULT' || m === 'DEF') { if (this.bareOsLogicalSigaction) delete this.bareOsLogicalSigaction[s] return { ok: true, signal: s, mode: 'DEFAULT' } } if (m === 'IGNORE' || m === 'IGN') { if (!this.bareOsLogicalSigaction) { throw new Error('bareOsSigaction: internal state missing') } this.bareOsLogicalSigaction[s] = 'IGNORE' return { ok: true, signal: s, mode: 'IGNORE' } } throw new Error('bareOsSigaction: mode must be IGNORE or DEFAULT') }, /** @param {Record} desc */ bareOsRegisterSnapshotHandle(desc) { if (!desc || typeof desc !== 'object') return if (!Array.isArray(this.bareOsSnapshotHandles)) { this.bareOsSnapshotHandles = [] } const id = typeof desc.id === 'string' && desc.id.trim() ? desc.id.trim().slice(0, 128) : `snap-${this.bareOsSnapshotHandles.length}` this.bareOsSnapshotHandles.push({ ...desc, id, atMs: Date.now() }) } } }