static void execproc(void *a) { int i, fd; Client *c; char tmp[32]; c = a; snprint(tmp, sizeof tmp, "execproc%d", c->num); threadsetname(tmp); if(pipe(c->fd) < 0){ rerrstr(c->err, sizeof c->err); sendul(c->execpid, -1); return; } rfork(RFFDG); fd = c->fd[1]; close(c->fd[0]); dup(fd, 0); dup(fd, 1); for(i=3; i<100; i++) /* should do better */ close(i); strcpy(c->err, "exec failed"); procexecl(c->execpid, "/bin/rc", "rc", "-c", c->cmd, nil); }
void decexec(void *a) { char buf[256]; Playfd *pfd; Pacbuf *pb; threadsetname("decexec"); pfd = a; close(pfd->cfd); /* read fd */ if(pfd->fd != 1){ dup(pfd->fd, 1); close(pfd->fd); } close(0); open("/dev/null", OREAD); close(2); open("/dev/null", OWRITE); strncpy(buf, pfd->filename, sizeof(buf)-1); buf[sizeof(buf)-1] = 0; free(pfd->filename); free(pfd); procexecl(nil, "/bin/play", "play", "-o", "/fd/1", buf, nil); if((pb = nbrecvp(spare)) == nil) pb = malloc(sizeof(Pacbuf)); pb->cmd = Error; pb->off = 0; pb->len = snprint(pb->data, sizeof(pb->data), "startplay: exec play failed"); sendp(full, pb); threadexits("exec"); }
void execproc(void *v) { Channel *sync; Exec *e; int p[2], q[2]; char *cmd; threadsetname("execproc"); e = v; p[0] = e->p[0]; p[1] = e->p[1]; q[0] = e->q[0]; q[1] = e->q[1]; cmd = e->cmd; sync = e->sync; rfork(RFFDG); free(e); dup(p[0], 0); close(p[0]); close(p[1]); if(q[0]){ dup(q[1], 1); close(q[0]); close(q[1]); } if(!procstderr) close(2); procexecl(sync, "/bin/rc", "rc", "-c", cmd, 0); error("can't exec"); }
void execdiff(void *v) { char buf[64]; Diffarg *a; a = v; rfork(RFFDG); close(0); open("/dev/null", OREAD); sprint(buf, "/mnt/wsys/%d/body", a->w->win->id); close(1); open(buf, OWRITE); close(2); open(buf, OWRITE); sprint(buf, "/mnt/wsys/%d", a->w->win->id); bind(buf, "/dev", MBEFORE); procexecl(nil, "/acme/wiki/wiki.diff", "wiki.diff", a->dir, nil); }
static void execproc(void *v) { Exec *e; threadsetname("execproc"); e = v; rfork(RFFDG); dup(e->p[0], 0); close(e->p[0]); close(e->p[1]); if(e->q[0]) { dup(e->q[1], 1); close(e->q[0]); close(e->q[1]); } if(!procstderr) close(2); procexecl(e->sync, "/bin/rc", "rc", "-c", e->cmd, nil); error("can't exec"); }