Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/wapython
Path: blob/main/core/kernel/src/wasm/posix/spawn.ts
1068 views
1
/*
2
I do intend to implement all the spawn system calls using node.js at some point, so that python-wasm on nodejs is
3
able to create and use subprocesses, at least when in an insecure mode. In the browser, it could also create
4
other webassembly workers for a restricted collection of "commands". However, for now, these shall all throw
5
an error.
6
7
SEE fork-exec.ts and posix-context.ts for partial solutions to the above for the fork/exec pattern!
8
*/
9
10
import { notImplemented } from "./util";
11
12
import { getSignalSet, setSignalSet } from "./signal";
13
14
export default function spawn(context) {
15
const { callFunction, posix, recv, send } = context;
16
17
function getFileActions() {
18
if (context.state.fileActions == null) {
19
context.state.spawn_fileActions = {};
20
}
21
return context.state.spawn_fileActions;
22
}
23
function getAttrs() {
24
if (context.state.spawn_attrs == null) {
25
context.state.spawn_attrs = {};
26
}
27
return context.state.spawn_attrs;
28
}
29
30
function getAttr(ptr: number, expand: boolean = false) {
31
const attrs = getAttrs();
32
if (attrs[ptr] == null) {
33
return (attrs[ptr] = {});
34
}
35
const attr = attrs[ptr];
36
if (attr != null) {
37
if (expand) {
38
if (attr.sigdefaultPtr != null) {
39
attr.sigdefault = getSignalSet(attr.sigdefaultPtr);
40
}
41
if (attr.sigmaskPtr != null) {
42
attr.sigmask = getSignalSet(attr.sigmaskPtr);
43
}
44
}
45
return attr;
46
} else {
47
throw Error("bug"); // impossible
48
}
49
}
50
51
return {
52
posix_spawnattr_setschedparam: (
53
attrPtr: number,
54
schedparamPtr: number
55
): number => {
56
getAttr(attrPtr).schedparam = {
57
sched_priority: callFunction(
58
"get_posix_spawnattr_schedparam_sched_priority",
59
schedparamPtr
60
),
61
};
62
return 0;
63
},
64
65
posix_spawnattr_getschedparam: (
66
attrPtr: number,
67
schedparamPtr: number
68
): number => {
69
const sched_priority = getAttr(attrPtr).schedparam ?? 0;
70
callFunction(
71
"set_posix_spawnattr_schedparam_sched_priority",
72
schedparamPtr,
73
sched_priority
74
);
75
return 0;
76
},
77
78
posix_spawnattr_setschedpolicy: (attrPtr: number, schedpolicy: number) => {
79
getAttr(attrPtr).schedpolicy = schedpolicy;
80
return 0;
81
},
82
83
posix_spawnattr_getschedpolicy: (
84
attrPtr: number,
85
schedpolicyPtr: number
86
) => {
87
send.i32(schedpolicyPtr, getAttr(attrPtr).schedpolicy ?? 0);
88
return 0;
89
},
90
91
posix_spawnattr_init: (attrPtr: number): number => {
92
const attrs = getAttrs();
93
attrs[attrPtr] = {};
94
return 0;
95
},
96
97
posix_spawnattr_destroy: (attrPtr: number): number => {
98
const attrs = getAttrs();
99
delete attrs[attrPtr];
100
return 0;
101
},
102
103
posix_spawnattr_setflags: (attrPtr: number, flags: number): number => {
104
getAttr(attrPtr).flags = flags;
105
return 0;
106
},
107
108
posix_spawnattr_getflags: (attrPtr: number, flagsPtr: number): number => {
109
send.i32(flagsPtr, getAttr(attrPtr).flags ?? 0);
110
return 0;
111
},
112
113
posix_spawnattr_setpgroup: (attrPtr: number, pgroup: number): number => {
114
getAttr(attrPtr).pgroup = pgroup;
115
return 0;
116
},
117
118
posix_spawnattr_getpgroup: (attrPtr: number, pgroupPtr: number): number => {
119
send.i32(pgroupPtr, getAttr(attrPtr).pgroup ?? 0);
120
return 0;
121
},
122
123
posix_spawnattr_setsigmask: (
124
attrPtr: number,
125
sigmaskPtr: number
126
): number => {
127
getAttr(attrPtr).sigmaskPtr = sigmaskPtr;
128
return 0;
129
},
130
131
posix_spawnattr_getsigmask: (
132
attrPtr: number,
133
sigmaskPtr: number
134
): number => {
135
const cur = getAttr(attrPtr).sigmaskPtr;
136
setSignalSet(sigmaskPtr, getSignalSet(cur));
137
return 0;
138
},
139
140
posix_spawnattr_setsigdefault: (
141
attrPtr: number,
142
sigdefaultPtr: number
143
): number => {
144
getAttr(attrPtr).sigdefaultPtr = sigdefaultPtr;
145
return 0;
146
},
147
148
posix_spawnattr_getsigdefault: (
149
attrPtr: number,
150
sigdefaultPtr: number
151
): number => {
152
const cur = getAttr(attrPtr).sigdefaultPtr;
153
setSignalSet(sigdefaultPtr, getSignalSet(cur));
154
return 0;
155
},
156
157
posix_spawn: (
158
pidPtr,
159
pathPtr,
160
fileActionsPtr,
161
attrPtr,
162
argvPtr,
163
envpPtr
164
): number => {
165
if (posix.posix_spawn == null) {
166
notImplemented("posix_spawn");
167
}
168
const path = recv.string(pathPtr);
169
const argv = recv.arrayOfStrings(argvPtr);
170
const envp = recv.arrayOfStrings(envpPtr);
171
const fileActions = getFileActions();
172
const pid = posix.posix_spawn(
173
path,
174
fileActions[fileActionsPtr],
175
getAttr(attrPtr, true),
176
argv,
177
envp
178
);
179
send.i32(pidPtr, pid);
180
return 0;
181
},
182
183
posix_spawnp: (
184
pidPtr,
185
pathPtr,
186
fileActionsPtr,
187
attrPtr,
188
argvPtr,
189
envpPtr
190
): number => {
191
if (posix.posix_spawnp == null) {
192
notImplemented("posix_spawnp");
193
}
194
const path = recv.string(pathPtr);
195
const argv = recv.arrayOfStrings(argvPtr);
196
const envp = recv.arrayOfStrings(envpPtr);
197
const fileActions = getFileActions();
198
const pid = posix.posix_spawnp(
199
path,
200
fileActions[fileActionsPtr],
201
getAttr(attrPtr, true),
202
argv,
203
envp
204
);
205
send.i32(pidPtr, pid);
206
return 0;
207
},
208
209
posix_spawn_file_actions_init: (fileActionsPtr: number): number => {
210
const fileActions = getFileActions();
211
fileActions[fileActionsPtr] = [];
212
return 0;
213
},
214
215
posix_spawn_file_actions_destroy: (fileActionsPtr: number): number => {
216
const fileActions = getFileActions();
217
delete fileActions[fileActionsPtr];
218
return 0;
219
},
220
221
posix_spawn_file_actions_addclose: (
222
fileActionsPtr: number,
223
fd: number
224
): number => {
225
const fileActions = getFileActions();
226
if (fileActions[fileActionsPtr] == null) {
227
fileActions[fileActionsPtr] = [];
228
}
229
fileActions[fileActionsPtr].push(["addclose", fd]);
230
return 0;
231
},
232
233
posix_spawn_file_actions_addopen: (
234
fileActionsPtr: number,
235
fd: number,
236
pathPtr: number,
237
oflag: number,
238
mode: number
239
): number => {
240
const fileActions = getFileActions();
241
if (fileActions[fileActionsPtr] == null) {
242
fileActions[fileActionsPtr] = [];
243
}
244
const path = recv.string(pathPtr);
245
fileActions[fileActionsPtr].push(["addopen", fd, path, oflag, mode]);
246
return 0;
247
},
248
249
posix_spawn_file_actions_adddup2: (
250
fileActionsPtr: number,
251
fd: number,
252
new_fd: number
253
): number => {
254
const fileActions = getFileActions();
255
if (fileActions[fileActionsPtr] == null) {
256
fileActions[fileActionsPtr] = [];
257
}
258
fileActions[fileActionsPtr].push(["adddup2", fd, new_fd]);
259
return 0;
260
},
261
};
262
}
263
264