Files
bare-operating-system/packages/bare-os-booter/lib/posix/bare-os-syscall-ops.js
T
2026-08-18 18:11:28 -04:00

597 lines
17 KiB
JavaScript

/**
* Stock `ctx.bareOsSyscall` op names (single source for `/proc` introspection).
* Keep in sync with `BARE_OS_SYSCALL_OPS` in `packages/bare-os-coreutils/src/getconf.js`
* and `docs/reference/posix-conformance-matrix.json`.
*/
/** @typedef {'stable' | 'experimental'} BareOsSyscallStability */
/** @typedef {'fs' | 'proc' | 'ipc' | 'signal' | 'vfs_meta'} BareOsSyscallCategory */
/**
* Rich syscall table for `/proc/bare_os/syscalls.json` (schema v3+; v4 adds fd/signal models in index.js).
* @type {ReadonlyArray<{ name: string, category: BareOsSyscallCategory, stability: BareOsSyscallStability }>}
*/
export const BARE_OS_SYSCALL_OPS_DETAIL = Object.freeze([
{ name: 'readFile', category: 'fs', stability: 'stable' },
{ name: 'writeFile', category: 'fs', stability: 'stable' },
{ name: 'readdir', category: 'fs', stability: 'stable' },
{ name: 'mkdir', category: 'fs', stability: 'stable' },
{ name: 'stat', category: 'fs', stability: 'stable' },
{ name: 'unlink', category: 'fs', stability: 'stable' },
{ name: 'chmod', category: 'fs', stability: 'stable' },
{ name: 'chdir', category: 'fs', stability: 'stable' },
{ name: 'getcwd', category: 'fs', stability: 'stable' },
{ name: 'readlink', category: 'fs', stability: 'stable' },
{ name: 'symlink', category: 'fs', stability: 'stable' },
{ name: 'exists', category: 'fs', stability: 'stable' },
{ name: 'lstat', category: 'fs', stability: 'stable' },
{ name: 'rmdir', category: 'fs', stability: 'stable' },
{ name: 'mount', category: 'vfs_meta', stability: 'experimental' },
{ name: 'umount', category: 'vfs_meta', stability: 'experimental' },
{ name: 'kill', category: 'signal', stability: 'stable' },
{ name: 'rename', category: 'fs', stability: 'stable' },
{ name: 'link', category: 'fs', stability: 'experimental' },
{ name: 'access', category: 'fs', stability: 'stable' },
{ name: 'utimes', category: 'fs', stability: 'stable' },
{ name: 'truncate', category: 'fs', stability: 'stable' },
{ name: 'ftruncate', category: 'fs', stability: 'experimental' },
{ name: 'fsync', category: 'fs', stability: 'experimental' },
{ name: 'fdatasync', category: 'fs', stability: 'experimental' },
{ name: 'posix_fadvise', category: 'fs', stability: 'experimental' },
{ name: 'pathconf', category: 'fs', stability: 'experimental' },
{ name: 'fcntl', category: 'fs', stability: 'stable' },
{ name: 'posixPoll', category: 'fs', stability: 'experimental' },
{ name: 'select', category: 'fs', stability: 'experimental' },
{ name: 'umask', category: 'fs', stability: 'stable' },
{
name: 'socket',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['ctx.bare bare-tcp / bare-dgram', 'Hyperswarm/Protomux P2P'],
errnoHint: 'ENOSYS'
},
{
name: 'bind',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['bare-tcp Server.listen', 'not AF_INET kernel sockets'],
errnoHint: 'ENOSYS'
},
{
name: 'listen',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['bare-tcp listen backlog analogs'],
errnoHint: 'ENOSYS'
},
{
name: 'accept',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['bare-tcp accept'],
errnoHint: 'ENOSYS'
},
{
name: 'connect',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['bare-tcp connect', 'UDX'],
errnoHint: 'ENOSYS'
},
{
name: 'send',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['stream.write'],
errnoHint: 'ENOSYS'
},
{
name: 'recv',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['stream.read'],
errnoHint: 'ENOSYS'
},
{
name: 'sendmsg',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['flattened iovec send on SOCK_DGRAM bridge'],
errnoHint: 'ENOSYS'
},
{
name: 'recvmsg',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['SOCK_DGRAM bridge datagram + msgHdr envelope'],
errnoHint: 'ENOSYS'
},
{
name: 'shutdown',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['stream.end / destroy'],
errnoHint: 'ENOSYS'
},
{
name: 'getsockopt',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("getsockopt")',
'BARE_OS_POSIX_SOCKET_FD_BRIDGE: SOL_SOCKET/SO_KEEPALIVE and IPPROTO_TCP/TCP_NODELAY on bridge fds only; else ENOSYS'
],
errnoHint: 'ENOSYS'
},
{
name: 'setsockopt',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("setsockopt")',
'bridge fds: same levels/optnames as getsockopt; logical slot state only'
],
errnoHint: 'ENOSYS'
},
{
name: 'readv',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("readv")',
'bounded sequential reads from posix-pipe read FD (BARE_OS_POSIX_FD_SIM)'
],
errnoHint: 'EINVAL'
},
{
name: 'writev',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("writev")',
'bounded concatenated write to posix-pipe write FD (BARE_OS_POSIX_FD_SIM)'
],
errnoHint: 'EINVAL'
},
{
name: 'mq_open',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsSyscall("mq_open")', 'bareOsIpc.mqOpen'],
errnoHint: 'EINVAL'
},
{
name: 'mq_send',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsSyscall("mq_send")', 'bareOsIpc.mqSend'],
errnoHint: 'EAGAIN'
},
{
name: 'mq_receive',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsSyscall("mq_receive")', 'bareOsIpc.mqReceive'],
errnoHint: 'EAGAIN'
},
{
name: 'clock_gettime',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("clock_gettime")',
'CLOCK_REALTIME from Date; CLOCK_MONOTONIC from bare-hrtime.bigint() or performance.now() sketch'
],
errnoHint: 'EINVAL'
}
])
/**
* POSIX.1 XSH-style names mapped to guest behavior (not separate `ctx.bareOsSyscall` ops).
* Merged into `/proc/bare_os/syscalls.json` **`opsDetail`** for Issue 7 traceability.
* @type {ReadonlyArray<{
* name: string,
* category: BareOsSyscallCategory,
* stability: BareOsSyscallStability,
* posixAlignment: 'simulated' | 'partial' | 'ENOTSUP',
* mapsTo: string[],
* errnoHint?: string
* }>}
*/
export const BARE_OS_POSIX_XSH_OPS_DETAIL = Object.freeze([
{
name: 'open',
category: 'fs',
stability: 'stable',
posixAlignment: 'simulated',
mapsTo: ['vfs.readFile', 'vfs.writeFile', 'vfs.exists', 'vfs.lstat'],
errnoHint: 'ENOENT'
},
{
name: 'close',
category: 'fs',
stability: 'stable',
posixAlignment: 'partial',
mapsTo: ['logical fd table eviction', 'IPC channel teardown'],
errnoHint: 'EBADF'
},
{
name: 'read',
category: 'fs',
stability: 'stable',
posixAlignment: 'partial',
mapsTo: ['vfs.readFile', 'ctx.bareOsBinReadStdin', 'IPC fifo consumer'],
errnoHint: 'EAGAIN'
},
{
name: 'write',
category: 'fs',
stability: 'stable',
posixAlignment: 'partial',
mapsTo: ['vfs.writeFile', 'ctx.bareOsBinWrite', 'IPC fifo producer'],
errnoHint: 'EIO'
},
{
name: 'readv',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsSyscall("readv")', 'posix-pipe read FD', 'bounded iovec count'],
errnoHint: 'EINVAL'
},
{
name: 'writev',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsSyscall("writev")', 'posix-pipe write FD', 'bounded total bytes'],
errnoHint: 'EINVAL'
},
{
name: 'getsockopt',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("getsockopt")',
'BARE_OS_POSIX_SOCKET_FD_BRIDGE: SOL_SOCKET/SO_KEEPALIVE and IPPROTO_TCP/TCP_NODELAY on bridge fds only; else ENOSYS'
],
errnoHint: 'ENOSYS'
},
{
name: 'setsockopt',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("setsockopt")',
'bridge fds: same levels/optnames as getsockopt; logical slot state only'
],
errnoHint: 'ENOSYS'
},
{
name: 'lseek',
category: 'fs',
stability: 'stable',
posixAlignment: 'ENOTSUP',
mapsTo: ['no byte-offset FD cursor in guest'],
errnoHint: 'ESPIPE'
},
{
name: 'nanosleep',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsSyscall("nanosleep")', 'Issue 7-style delay; capped wall sleep'],
errnoHint: 'EINVAL'
},
{
name: 'clock_gettime',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("clock_gettime")',
'args.clockId CLOCK_REALTIME vs CLOCK_MONOTONIC; tv_sec/tv_nsec partial POSIX shape'
],
errnoHint: 'EINVAL'
},
{
name: 'posix_fadvise',
category: 'fs',
stability: 'experimental',
posixAlignment: 'simulated',
mapsTo: [
'ctx.bareOsSyscall("posix_fadvise")',
'logical no-op; documents POSIX.1 posix_fadvise intent for Hyperdrive-backed paths'
],
errnoHint: 'EINVAL'
},
{
name: 'pipe',
category: 'ipc',
stability: 'stable',
posixAlignment: 'simulated',
mapsTo: ['mkfifo', '/run/bare-os/ipc/*', 'BARE_OS_POSIX_FD_SIM optional channel pairs'],
errnoHint: 'EMFILE'
},
{
name: 'dup',
category: 'fs',
stability: 'stable',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsRegisterLogicalFd'],
errnoHint: 'EBADF'
},
{
name: 'dup2',
category: 'fs',
stability: 'stable',
posixAlignment: 'partial',
mapsTo: ['shell redirect table', '2>&1 merge'],
errnoHint: 'EBADF'
},
{
name: 'fcntl',
category: 'fs',
stability: 'stable',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("fcntl")',
'F_GETFL',
'F_SETFL',
'F_GETLK',
'F_SETLK',
'F_SETLKW',
'cooperative session-scoped advisory locks (path or fd→path); F_SETLKW is EAGAIN when busy unless BARE_OS_POSIX_FCNTL_BLOCKING_WAIT (bounded wait via BARE_OS_FCNTL_LOCK_WAIT_MS_MAX)',
'O_APPEND',
'O_NONBLOCK',
'bareOsLogicalFdFlags'
],
errnoHint: 'EBADF'
},
{
name: 'poll',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsPosixPoll', 'ctx.bareOsSyscall("posixPoll")'],
errnoHint: 'EINVAL'
},
{
name: 'select',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: ['ctx.bareOsSyscall("select")', 'bareOsPosixPollProbe subset'],
errnoHint: 'EBADF'
},
{
name: 'umask',
category: 'fs',
stability: 'stable',
posixAlignment: 'partial',
mapsTo: ['vfs.env.UMASK octal', 'umask shell builtin'],
errnoHint: 'EINVAL'
},
{
name: 'fsync',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("fsync")',
'cooperative no-op; Hyperdrive persistence is host-managed'
],
errnoHint: 'EINVAL'
},
{
name: 'fdatasync',
category: 'fs',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("fdatasync")',
'cooperative no-op; same sketch as fsync on guest'
],
errnoHint: 'EINVAL'
},
{
name: 'socket',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: ['ctx.bareOsSyscall("socket")', 'ENOSYS-shaped probe'],
errnoHint: 'ENOSYS'
},
{
name: 'bind',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("bind")',
'SOCK_STREAM bridge: port+host before listen; SOCK_DGRAM passive bind via bareDgram.Socket.bind (BARE_OS_POSIX_SOCKET_FD_BRIDGE)'
],
errnoHint: 'EINVAL'
},
{
name: 'listen',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("listen")',
'bareTcp.Server.listen when BARE_OS_POSIX_SOCKET_FD_BRIDGE'
],
errnoHint: 'EADDRINUSE'
},
{
name: 'accept',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("accept")',
'dequeue accepted TCP socket to new logical fd; EAGAIN when empty + O_NONBLOCK'
],
errnoHint: 'EAGAIN'
},
{
name: 'connect',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'ENOTSUP',
mapsTo: [
'ctx.bareOsSyscall("connect")',
'SOCK_STREAM/SOCK_DGRAM bridge when BARE_OS_POSIX_SOCKET_FD_BRIDGE (DGRAM may follow bind on same fd)'
],
errnoHint: 'ENOSYS'
},
{
name: 'send',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("send")',
'SOCK_DGRAM connected or bound (bound requires port+host args) + SOCK_STREAM (accepted) bridge write'
],
errnoHint: 'ENOSYS'
},
{
name: 'recv',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("recv")',
'SOCK_DGRAM bridge dequeue; SOCK_STREAM accepted fd tcpRecvQueue (BARE_OS_POSIX_SOCKET_FD_BRIDGE)'
],
errnoHint: 'ENOSYS'
},
{
name: 'recvfrom',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("recvfrom")',
'SOCK_DGRAM bridge + peer address; SOCK_STREAM accepted + remoteAddress/remotePort'
],
errnoHint: 'ENOSYS'
},
{
name: 'sendmsg',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("sendmsg")',
'SOCK_DGRAM + SOCK_STREAM bridge flattened iovs (BARE_OS_POSIX_SOCKET_FD_BRIDGE); ancillary CMSGS ENOTSUP'
],
errnoHint: 'ENOSYS'
},
{
name: 'recvmsg',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("recvmsg")',
'SOCK_DGRAM bridge + msgHdr.name from rinfo; SOCK_STREAM accepted + remote addr; scatter iov / SCM_RIGHTS ENOTSUP'
],
errnoHint: 'ENOSYS'
},
{
name: 'shutdown',
category: 'ipc',
stability: 'experimental',
posixAlignment: 'partial',
mapsTo: [
'ctx.bareOsSyscall("shutdown")',
'TCP bridge: destroy socket or close listening Server'
],
errnoHint: 'EINVAL'
}
])
/** Full `opsDetail` for proc JSON (ctx ops + POSIX XSH surface). */
export const BARE_OS_SYSCALL_OPS_DETAIL_FULL = Object.freeze([
...BARE_OS_SYSCALL_OPS_DETAIL,
...BARE_OS_POSIX_XSH_OPS_DETAIL
])
/**
* Stable Open Group Issue 7 index tokens for audit dashboards (not a conformance claim).
* @type {Readonly<Record<string, readonly string[]>>}
*/
export const BARE_OS_SYSCALL_OPS_SUSV4_REFS = Object.freeze({
open: Object.freeze(['XSH/open']),
close: Object.freeze(['XSH/close']),
read: Object.freeze(['XSH/read']),
write: Object.freeze(['XSH/write']),
readv: Object.freeze(['XSH/readv']),
writev: Object.freeze(['XSH/writev']),
pipe: Object.freeze(['XSH/pipe']),
dup: Object.freeze(['XSH/dup']),
dup2: Object.freeze(['XSH/dup2']),
fcntl: Object.freeze(['XSH/fcntl']),
poll: Object.freeze(['XSH/poll']),
select: Object.freeze(['XSH/select']),
umask: Object.freeze(['XSH/umask']),
lseek: Object.freeze(['XSH/lseek']),
nanosleep: Object.freeze(['XSH/nanosleep']),
clock_gettime: Object.freeze(['XSH/clock_gettime']),
posix_fadvise: Object.freeze(['XSH/posix_fadvise']),
fsync: Object.freeze(['XSH/fsync']),
fdatasync: Object.freeze(['XSH/fdatasync']),
pathconf: Object.freeze(['XSH/pathconf']),
mq_open: Object.freeze(['XSH/mq_open']),
mq_send: Object.freeze(['XSH/mq_send']),
mq_receive: Object.freeze(['XSH/mq_receive']),
socket: Object.freeze(['XSH/socket']),
bind: Object.freeze(['XSH/bind']),
listen: Object.freeze(['XSH/listen']),
accept: Object.freeze(['XSH/accept']),
connect: Object.freeze(['XSH/connect']),
send: Object.freeze(['XSH/send']),
recv: Object.freeze(['XSH/recv']),
recvfrom: Object.freeze(['XSH/recvfrom']),
sendmsg: Object.freeze(['XSH/sendmsg']),
recvmsg: Object.freeze(['XSH/recvmsg']),
shutdown: Object.freeze(['XSH/shutdown']),
getsockopt: Object.freeze(['XSH/getsockopt']),
setsockopt: Object.freeze(['XSH/setsockopt'])
})
export const BARE_OS_STOCK_SYSCALL_OPS = Object.freeze(
BARE_OS_SYSCALL_OPS_DETAIL.map((o) => o.name)
)
export function bareOsStockSyscallOpsCsv() {
return BARE_OS_STOCK_SYSCALL_OPS.join(',')
}
export function bareOsPosixXshOpsCsv() {
return BARE_OS_POSIX_XSH_OPS_DETAIL.map((o) => o.name).join(',')
}