Adopt pipe handle inheritance

This commit is contained in:
2025-09-19 18:12:36 +02:00
parent 2d7ceb4b43
commit ad56890ee9
3 changed files with 15 additions and 38 deletions

View File

@ -13,7 +13,7 @@
#include "interp.h"
#include "runtime.h"
#define SUBPROC_PIPE_OUT 0x1f
/* #define SUBPROC_PIPE_OUT 31 */
extern uint64_t PID;
@ -210,34 +210,18 @@ bool interp_runstring(const char *string, InterpResult **res, bool logcmds) {
argtk = argtk->next;
}
#define OUTBUF_MAX 1024
char *outbuf = dlmalloc(OUTBUF_MAX);
string_memset(outbuf, 0, OUTBUF_MAX);
ipcpipe(PID, SUBPROC_PIPE_OUT, IPCPIPE_MAKE, NULL, 0);
int32_t app = processctl(-1, PCTL_SPAWN, (uint64_t)(char *)appname, (uint64_t)args1, argslen1);
int32_t app = processctl(-1, PCTL_SPAWN, (uint64_t)appname, (uint64_t)args1, argslen1);
if (app < 0) {
usprintf(RES.errmsg, "Could not run %s: %s\n", appname, ERRSTRING(app));
ok = false;
goto cleanup;
}
ipcpipe(app, IPCPIPE_OUT, IPCPIPE_REPLACE, (uint8_t *)PID, SUBPROC_PIPE_OUT);
ipcpipe(app, IPCPIPE_IN, IPCPIPE_REPLACE, (uint8_t *)PID, IPCPIPE_IN);
processctl(app, PCTL_RUN, 0, 0, 0);
do {
int32_t nrd = ipcpipe(PID, SUBPROC_PIPE_OUT, IPCPIPE_READ, (uint8_t *)outbuf, OUTBUF_MAX);
if (nrd > 0) {
uprintf("%s", outbuf);
string_memset(outbuf, 0, OUTBUF_MAX);
}
} while(processctl(app, PCTL_POLLSTATE, 0, 0, 0) != 4);
while(processctl(app, PCTL_POLLSTATE, 0, 0, 0) != 4);
cleanup:
ipcpipe(PID, SUBPROC_PIPE_OUT, IPCPIPE_DELETE, NULL, 0);
dlfree(outbuf);
for (size_t j = 0; j < argslen1; j++) {
dlfree(args1[j]);
}