#include "xcpusrv.h"
void runit(void *ac) {
Client *c = ac;
/* kudos to p9p, they do a bidi pipe */
int pid;
// char err[128];
char *argv[128];
int ntoken;
int i;
ntoken = tokenize(c->argv, argv, 127);
argv[ntoken] = 0;
// debug(12, "ntokedn %d\n", ntoken);
// for(i = 0; i < ntoken; i++)
// debug(12, argv[i]);
pipe(c->stdinfd);
pipe(c->stdoutfd);
pipe(c->stderrfd);
kidfds[0] = c->stdinfd[1];
kidfds[1] = c->stdoutfd[1];
kidfds[2] = c->stderrfd[1];
pid = fork();
// if (pid < 0)
// debug(12, "FORK FAIL\n");
if (pid > 0){
(void)close(c->stdinfd[1]);
(void)close(c->stdoutfd[1]);
(void)close(c->stderrfd[1]);
return;
}
// debug(12, "runit: spawn %s already\n", c->tmpname);
dup(c->stdinfd[1], 0);
dup(c->stdoutfd[1], 1);
dup(c->stderrfd[1], 2);
(void)close(c->stdinfd[1]);
(void)close(c->stdoutfd[0]);
(void)close(c->stderrfd[0]);
exec(c->tmpname, argv);
dup(2, open("/dev/cons", ORDWR));
// debug(12, "FUCK! exec failed: %r\n");
}
void tmpexec(Client *c) {
c->tmpname = strdup("/tmp/xcpuXXXXXXXXXXX");
mktemp(c->tmpname);
c->tmpfd = create(c->tmpname, ORDWR, 0700);
}
int mkdebugfd(void){
char *console = "/dev/cons";
int debugfd;
debugfd = open(console, ORDWR);
if (debugfd < 0)
threadexits(smprint("NO %s\n", console));
return debugfd;
}
|