Exemple #1
0
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);
}
Exemple #2
0
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");
}
Exemple #3
0
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");
}
Exemple #4
0
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);
}
Exemple #5
0
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");
}