169 lines
6.5 KiB
JavaScript
169 lines
6.5 KiB
JavaScript
/**
|
|
* 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
|
|
}
|
|
}
|
|
}
|