Files
bare-operating-system/packages/bare-os-booter/lib/bare-os-socket-scm-rights.js
T
Raven Scott 7f4279d315 feat: POSIX/P2P roadmap — multisig shape, socket bridge, bin index, docs
- Unify pear.multisig.json validation via bare-os-protocol + kernel boot fragment
- Socket bridge: SCM_RIGHTS path, ancillary handling, TCP half-close/shutdown how,
  connect tcpRecvQueue + poll/recv EOF and EPIPE-shaped errors
- Bin manifest / Hyperbee hints schema 2 + namesDigest; batch-write invalidation
- Host booter structured logging; BOOT_PERF_DETAIL bare_stdlib_merge_ns timing
- Wasm kernel optional syscall imports; security_posture rotation hints schema 2
- Shell errexit inside compound bodies; expand getconf/_SC_* and bareOsGetconfSysconf
- Subprocess bridge snapshot timeoutPolicy; blind-relay protomux backpressure tests
- Pear updater minimal delegate example + verify-pear scan; holepunch drift repos
- Refresh handbook, kernel-image, syscall-socket-contract, posix matrix, PEAR-RUN

Rebuild coreutils/bundles; bundle kernel; keep seeder/kernel parity.
2026-04-05 02:08:38 -04:00

101 lines
3.0 KiB
JavaScript

/**
* Optional SCM_RIGHTS-style logical FD duplication for the POSIX socket FD bridge
* (`BARE_OS_POSIX_SOCKET_SCM_RIGHTS=1`). See docs/reference/syscall-socket-contract.md.
*/
/**
* @param {Record<string, string | undefined>} env
*/
export function wantPosixSocketScmRights(env) {
const v = String(env?.BARE_OS_POSIX_SOCKET_SCM_RIGHTS ?? '')
.trim()
.toLowerCase()
return v === '1' || v === 'true'
}
/**
* @param {Record<string, string | undefined>} env
*/
export function bareOsScmRightsMaxFds(env) {
const raw = String(env?.BARE_OS_POSIX_SOCKET_SCM_RIGHTS_MAX_FDS ?? '').trim()
const n = Math.floor(Number(raw))
if (Number.isFinite(n) && n > 0) return Math.min(16, n)
return 4
}
/**
* @param {unknown[]} arr
* @returns {number[] | null}
*/
function collectFdsFromCmsgList(arr) {
/** @type {number[]} */
const fds = []
for (const item of arr) {
if (!item || typeof item !== 'object') return null
const o = /** @type {Record<string, unknown>} */ (item)
if (!Array.isArray(o.fds)) return null
for (const f of o.fds) {
const n = Number(f)
if (!Number.isFinite(n) || n < 0) return null
fds.push(n >>> 0)
}
}
return fds
}
/**
* @param {Record<string, unknown>} args
* @param {boolean} scmOn
* @param {number} maxFds
* @returns {{ ok: true, fds: number[] } | { ok: false, reject: string }}
*/
export function bareOsParseSendmsgScmRights(args, scmOn, maxFds) {
if (!args || typeof args !== 'object')
return { ok: true, fds: [] }
const ctl = args.control
if (ctl instanceof Uint8Array && ctl.byteLength > 0)
return { ok: false, reject: 'control' }
const clen = Number(args.controllen)
if (Number.isFinite(clen) && clen > 0)
return { ok: false, reject: 'controllen' }
const mh = args.msgHdr
if (mh && typeof mh === 'object') {
const mhc = /** @type {Record<string, unknown>} */ (mh).control
if (mhc instanceof Uint8Array && mhc.byteLength > 0)
return { ok: false, reject: 'msgHdr.control' }
}
/** @type {number[]} */
let fds = []
if (Array.isArray(args.cmsgs) && args.cmsgs.length > 0) {
const r = collectFdsFromCmsgList(args.cmsgs)
if (r === null) return { ok: false, reject: 'cmsgs' }
fds = fds.concat(r)
}
if (mh && typeof mh === 'object') {
const c2 = /** @type {Record<string, unknown>} */ (mh).cmsgs
if (Array.isArray(c2) && c2.length > 0) {
const r = collectFdsFromCmsgList(c2)
if (r === null) return { ok: false, reject: 'msgHdr.cmsgs' }
fds = fds.concat(r)
}
}
if (fds.length > maxFds) return { ok: false, reject: 'cmsgs_cap' }
if (!scmOn && fds.length > 0) return { ok: false, reject: 'cmsgs' }
return { ok: true, fds }
}
/**
* @param {unknown} slot
* @param {string} k decimal fd string
*/
export function bareOsEnsureSocketSlotAliasKeys(slot, k) {
if (!slot || typeof slot !== 'object') return
const s = /** @type {{ aliasKeys?: Set<string> }} */ (slot)
if (!s.aliasKeys || !(s.aliasKeys instanceof Set)) {
s.aliasKeys = new Set()
}
s.aliasKeys.add(k)
}