/** * ctx.bareOsPathconf / ctx.bareOsGetconfSysconf implementations. */ import { getBareOsPipelineLimits } from './shell-runtime.js' /** * @param {{ * env: Record, * resolveLogical: (pathArg: string) => string, * bootHrtimeNowNs?: (() => bigint) | null * }} deps */ export function createBareOsPathconfMethods(deps) { const { env, resolveLogical, bootHrtimeNowNs = null } = deps return { /** * Fixed pathconf/nameconf-style limits (no live host query). * @param {string} [_path] * @param {string} name */ bareOsPathconf(pathArg, name) { const k = String(name || '').trim() const p = resolveLogical(String(pathArg || '/').trim() || '/') const rawUnion = String(env.BARE_OS_VFS_UNION_PREFIXES || '') const underUnion = rawUnion .split(',') .map((s) => s.trim()) .filter((x) => x.startsWith('/')) .some((pre) => p === pre || p.startsWith(pre + '/')) const underMirror = p === '/mirror' || p.startsWith('/mirror/') const acctOn = env.BARE_OS_PERSONAL_ACCT_PREFIX === '1' || env.BARE_OS_PERSONAL_ACCT_PREFIX === 'true' const underPersonalAcct = acctOn && (p === '/.bare-os/acct' || p.startsWith('/.bare-os/acct/')) const underDevShm = p === '/dev/shm' || p.startsWith('/dev/shm/') /** @type {Record} */ const table = { PATH_MAX: 4096, NAME_MAX: 255, _PC_PATH_MAX: 4096, _PC_NAME_MAX: 255, _PC_SYMLINK_MAX: 1024, _PC_CHOWN_RESTRICTED: 1, _PC_NO_TRUNC: 1, _PC_FILESIZEBITS: 64, _PC_LINK_MAX: 1, _PC_MAX_CANON: 255, _PC_MAX_INPUT: 512, _PC_PIPE_BUF: 4096, _PC_2_SYMLINKS: 1, _POSIX_VERSION: 200809, _POSIX_THREAD_ATTR_STACKSIZE: 65536 } if (k === '_PC_CHOWN_RESTRICTED') { if (underMirror) return 0 return 1 } if ( k === '_PC_NO_TRUNC' && (underMirror || (underUnion && !underPersonalAcct)) ) { return 0 } if (underDevShm && k === '_PC_NAME_MAX') { return 128 } if (!k || table[k] === undefined) { throw new Error('bareOsPathconf: unknown name: ' + k) } return table[k] }, /** * Dynamic **`sysconf`**-style values for **`getconf _SC_*`** names (not path-specific). * @param {string} name * @returns {string | number | null} */ bareOsGetconfSysconf(name) { const n = String(name || '').trim() if (n === '_SC_NPROCESSORS_ONLN') { const raw = String(env.BARE_OS_NPROC || '').trim() const p = parseInt(raw, 10) if (Number.isFinite(p) && p > 0) return String(Math.min(4096, p)) return '4' } if (n === '_SC_PAGESIZE' || n === '_SC_PAGE_SIZE') return '4096' if (n === '_SC_PHYS_PAGES') { const raw = String(env.BARE_OS_PHYS_PAGES_HINT || '').trim() const p = parseInt(raw, 10) if (Number.isFinite(p) && p > 0) return String(p) return '524288' } if (n === '_SC_AVPHYS_PAGES') { const raw = String(env.BARE_OS_AVPHYS_PAGES_HINT || '').trim() const p = parseInt(raw, 10) if (Number.isFinite(p) && p > 0) return String(p) return '262144' } if (n === '_SC_OPEN_MAX') return '256' if (n === '_SC_STREAM_MAX') return '256' if (n === '_SC_CHILD_MAX') return '0' if (n === '_SC_CLK_TCK') return '100' if (n === '_SC_ARG_MAX') return '262144' if (n === '_SC_NPROCESSORS_CONF') { const raw = String(env.BARE_OS_NPROC || '').trim() const p = parseInt(raw, 10) if (Number.isFinite(p) && p > 0) return String(Math.min(4096, p)) return '4' } if (n === '_SC_HOST_NAME_MAX' || n === '_POSIX_HOST_NAME_MAX') return '255' if (n === '_SC_SYMLOOP_MAX') return '32' if (n === '_SC_IOV_MAX' || n === '_SC_UIO_MAXIOV') return '1024' if (n === '_SC_THREAD_DESTRUCTOR_ITERATIONS') return '4' if (n === '_SC_TTY_NAME_MAX') return '32' if (n === '_SC_LOGIN_NAME_MAX') return '256' if (n === '_SC_MONOTONIC_CLOCK') return '1' if (n === '_SC_MONOTONIC_CLOCK_RES') { return bootHrtimeNowNs ? '1' : '0' } if (n === '_SC_TRACE' || n === '_SC_TRACE_VERSION') return '-1' if (n === '_SC_RAW_SOCKETS') return '-1' if (n === '_SC_ADVISORY_INFO') return '0' if (n === '_SC_BARRIERS') return '-1' if (n === '_SC_SPIN_LOCKS') return '1' if (n === '_SC_TIMER_MAX') return '32' if (n === '_SC_DELAYTIMER_MAX') return '0' if (n === '_SC_ATEXIT_MAX') return '32' if (n === '_SC_LINE_MAX') return '2048' if (n === '_SC_BC_BASE_MAX') return '99' if (n === '_SC_BC_DIM_MAX') return '2048' if (n === '_SC_BC_SCALE_MAX') return '99' const pl = getBareOsPipelineLimits(env) if (n === '_SC_BARE_OS_PIPELINE_MAX_BYTES') return String(pl.maxBytes) if (n === '_SC_BARE_OS_PIPELINE_MAX_LINES') return String(pl.maxLines) if (n === '_SC_BARE_OS_PIPELINE_MAX_STAGES') return String(pl.maxStages) const parseCap = (key, def, cap) => { const raw = String(env[key] ?? '').trim() if (!raw) return String(def) const p = parseInt(raw, 10) if (!Number.isFinite(p) || p < 0) return String(def) return String(cap != null ? Math.min(cap, p) : p) } if (n === '_SC_BARE_OS_GLOB_MAX_MATCHES') return parseCap('BARE_OS_GLOB_MAX_MATCHES', 4096, null) if (n === '_SC_BARE_OS_SHELL_LOOP_MAX') return parseCap('BARE_OS_SHELL_LOOP_MAX', 10000, null) if (n === '_SC_BARE_OS_EXEC_MAX_DEPTH') return parseCap('BARE_OS_EXEC_MAX_DEPTH', 64, null) if (n === '_SC_BARE_OS_XARGS_MAX_PROCS') return parseCap('BARE_OS_XARGS_MAX_PROCS', 8, 32) if (n === '_SC_BARE_OS_SWARM_MAX_PEERS') return parseCap('BARE_OS_SWARM_MAX_PEERS', 512, null) if (n === '_SC_BARE_OS_SWARM_MAX_CLIENT_CONNECTIONS') return parseCap('BARE_OS_SWARM_MAX_CLIENT_CONNECTIONS', 256, null) if (n === '_SC_BARE_OS_SWARM_MAX_SERVER_CONNECTIONS') return parseCap('BARE_OS_SWARM_MAX_SERVER_CONNECTIONS', 256, null) if (n === '_SC_BARE_OS_SWARM_MAX_PARALLEL') return parseCap('BARE_OS_SWARM_MAX_PARALLEL', 64, null) if (n === '_SC_BARE_OS_DGRAM_RECVQ_MAX') return parseCap('BARE_OS_POSIX_DGRAM_RECVQ_MAX', 256, null) if (n === '_SC_BARE_OS_ACCEPT_QUEUE_MAX') return parseCap('BARE_OS_POSIX_ACCEPT_QUEUE_MAX', 64, null) return null } } }