This commit is contained in:
2026-08-18 18:11:28 -04:00
parent 0e9a650fa2
commit bbaf47028f
259 changed files with 0 additions and 0 deletions
@@ -0,0 +1,168 @@
/**
* ctx.bareOsPathconf / ctx.bareOsGetconfSysconf implementations.
*/
import { getBareOsPipelineLimits } from './shell-runtime.js'
/**
* @param {{
* env: Record<string, string | undefined>,
* 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<string, number>} */
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
}
}
}