Path: blob/main/core/kernel/src/wasm/posix/spawn.ts
1068 views
/*1I do intend to implement all the spawn system calls using node.js at some point, so that python-wasm on nodejs is2able to create and use subprocesses, at least when in an insecure mode. In the browser, it could also create3other webassembly workers for a restricted collection of "commands". However, for now, these shall all throw4an error.56SEE fork-exec.ts and posix-context.ts for partial solutions to the above for the fork/exec pattern!7*/89import { notImplemented } from "./util";1011import { getSignalSet, setSignalSet } from "./signal";1213export default function spawn(context) {14const { callFunction, posix, recv, send } = context;1516function getFileActions() {17if (context.state.fileActions == null) {18context.state.spawn_fileActions = {};19}20return context.state.spawn_fileActions;21}22function getAttrs() {23if (context.state.spawn_attrs == null) {24context.state.spawn_attrs = {};25}26return context.state.spawn_attrs;27}2829function getAttr(ptr: number, expand: boolean = false) {30const attrs = getAttrs();31if (attrs[ptr] == null) {32return (attrs[ptr] = {});33}34const attr = attrs[ptr];35if (attr != null) {36if (expand) {37if (attr.sigdefaultPtr != null) {38attr.sigdefault = getSignalSet(attr.sigdefaultPtr);39}40if (attr.sigmaskPtr != null) {41attr.sigmask = getSignalSet(attr.sigmaskPtr);42}43}44return attr;45} else {46throw Error("bug"); // impossible47}48}4950return {51posix_spawnattr_setschedparam: (52attrPtr: number,53schedparamPtr: number54): number => {55getAttr(attrPtr).schedparam = {56sched_priority: callFunction(57"get_posix_spawnattr_schedparam_sched_priority",58schedparamPtr59),60};61return 0;62},6364posix_spawnattr_getschedparam: (65attrPtr: number,66schedparamPtr: number67): number => {68const sched_priority = getAttr(attrPtr).schedparam ?? 0;69callFunction(70"set_posix_spawnattr_schedparam_sched_priority",71schedparamPtr,72sched_priority73);74return 0;75},7677posix_spawnattr_setschedpolicy: (attrPtr: number, schedpolicy: number) => {78getAttr(attrPtr).schedpolicy = schedpolicy;79return 0;80},8182posix_spawnattr_getschedpolicy: (83attrPtr: number,84schedpolicyPtr: number85) => {86send.i32(schedpolicyPtr, getAttr(attrPtr).schedpolicy ?? 0);87return 0;88},8990posix_spawnattr_init: (attrPtr: number): number => {91const attrs = getAttrs();92attrs[attrPtr] = {};93return 0;94},9596posix_spawnattr_destroy: (attrPtr: number): number => {97const attrs = getAttrs();98delete attrs[attrPtr];99return 0;100},101102posix_spawnattr_setflags: (attrPtr: number, flags: number): number => {103getAttr(attrPtr).flags = flags;104return 0;105},106107posix_spawnattr_getflags: (attrPtr: number, flagsPtr: number): number => {108send.i32(flagsPtr, getAttr(attrPtr).flags ?? 0);109return 0;110},111112posix_spawnattr_setpgroup: (attrPtr: number, pgroup: number): number => {113getAttr(attrPtr).pgroup = pgroup;114return 0;115},116117posix_spawnattr_getpgroup: (attrPtr: number, pgroupPtr: number): number => {118send.i32(pgroupPtr, getAttr(attrPtr).pgroup ?? 0);119return 0;120},121122posix_spawnattr_setsigmask: (123attrPtr: number,124sigmaskPtr: number125): number => {126getAttr(attrPtr).sigmaskPtr = sigmaskPtr;127return 0;128},129130posix_spawnattr_getsigmask: (131attrPtr: number,132sigmaskPtr: number133): number => {134const cur = getAttr(attrPtr).sigmaskPtr;135setSignalSet(sigmaskPtr, getSignalSet(cur));136return 0;137},138139posix_spawnattr_setsigdefault: (140attrPtr: number,141sigdefaultPtr: number142): number => {143getAttr(attrPtr).sigdefaultPtr = sigdefaultPtr;144return 0;145},146147posix_spawnattr_getsigdefault: (148attrPtr: number,149sigdefaultPtr: number150): number => {151const cur = getAttr(attrPtr).sigdefaultPtr;152setSignalSet(sigdefaultPtr, getSignalSet(cur));153return 0;154},155156posix_spawn: (157pidPtr,158pathPtr,159fileActionsPtr,160attrPtr,161argvPtr,162envpPtr163): number => {164if (posix.posix_spawn == null) {165notImplemented("posix_spawn");166}167const path = recv.string(pathPtr);168const argv = recv.arrayOfStrings(argvPtr);169const envp = recv.arrayOfStrings(envpPtr);170const fileActions = getFileActions();171const pid = posix.posix_spawn(172path,173fileActions[fileActionsPtr],174getAttr(attrPtr, true),175argv,176envp177);178send.i32(pidPtr, pid);179return 0;180},181182posix_spawnp: (183pidPtr,184pathPtr,185fileActionsPtr,186attrPtr,187argvPtr,188envpPtr189): number => {190if (posix.posix_spawnp == null) {191notImplemented("posix_spawnp");192}193const path = recv.string(pathPtr);194const argv = recv.arrayOfStrings(argvPtr);195const envp = recv.arrayOfStrings(envpPtr);196const fileActions = getFileActions();197const pid = posix.posix_spawnp(198path,199fileActions[fileActionsPtr],200getAttr(attrPtr, true),201argv,202envp203);204send.i32(pidPtr, pid);205return 0;206},207208posix_spawn_file_actions_init: (fileActionsPtr: number): number => {209const fileActions = getFileActions();210fileActions[fileActionsPtr] = [];211return 0;212},213214posix_spawn_file_actions_destroy: (fileActionsPtr: number): number => {215const fileActions = getFileActions();216delete fileActions[fileActionsPtr];217return 0;218},219220posix_spawn_file_actions_addclose: (221fileActionsPtr: number,222fd: number223): number => {224const fileActions = getFileActions();225if (fileActions[fileActionsPtr] == null) {226fileActions[fileActionsPtr] = [];227}228fileActions[fileActionsPtr].push(["addclose", fd]);229return 0;230},231232posix_spawn_file_actions_addopen: (233fileActionsPtr: number,234fd: number,235pathPtr: number,236oflag: number,237mode: number238): number => {239const fileActions = getFileActions();240if (fileActions[fileActionsPtr] == null) {241fileActions[fileActionsPtr] = [];242}243const path = recv.string(pathPtr);244fileActions[fileActionsPtr].push(["addopen", fd, path, oflag, mode]);245return 0;246},247248posix_spawn_file_actions_adddup2: (249fileActionsPtr: number,250fd: number,251new_fd: number252): number => {253const fileActions = getFileActions();254if (fileActions[fileActionsPtr] == null) {255fileActions[fileActionsPtr] = [];256}257fileActions[fileActionsPtr].push(["adddup2", fd, new_fd]);258return 0;259},260};261}262263264