コード例 #1
0
ファイル: Nt.c プロジェクト: aryx/fork-c--
static DWORD WINAPI
spinoff(HANDLE in, HANDLE out, char *args, char *cmd, Envy *e)
{
    char args2[8192], path[MAX_PATH], *s, *eb;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    Symtab *sym;


    /* set up the full path of the shell */
    sym = symlook("MKSH", S_VAR, 0);
    if(sym) {
        strncpy(path, ((Word*)(sym->value))->s, sizeof(path));
        path[MAX_PATH-1] = 0;
    } else {
        sym = symlook("ROOT", S_VAR, 0);
        if(sym)
            rootdir = ((Word*)(sym->value))->s;
        snprint(path, sizeof(path), "%s\\%s", rootdir, shell);
    }
    /* convert to backslash notation */
    for(s = strchr(path,'/'); s; s = strchr(s+1, '/'))
        *s = '\\';

    s = args2;
    s += snprint(args2, sizeof(args2)-1, "%s", path);
    if(shflags)
        s += snprint(s, args2+sizeof(args2)-s-1, " %s", shflags);
    if(args)
        s += snprint(s, args2+sizeof(args2)-s-1, " %s", args);
    if(cmd)
        s += snprint(s, args2+sizeof(args2)-s-1, " \"%s\"", cmd);

    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow = SW_SHOW;

    if (e)
        eb = exportenv(e);
    else
        eb = 0;
    si.hStdInput = duphandle(in);
    si.hStdOutput = duphandle(out);
    si.hStdError = duphandle(GetStdHandle(STD_ERROR_HANDLE));
    if(CreateProcess(path, args2, 0, 0, 1, 0, eb, 0, &si, &pi) == FALSE) {
        perror("can't find shell");
        Exit();
    }

    free(eb);

    CloseHandle(si.hStdInput);
    CloseHandle(si.hStdOutput);
    CloseHandle(si.hStdError);

    childadd(pi.hProcess, pi.dwProcessId);
    return pi.dwProcessId;
}
コード例 #2
0
ファイル: unix.c プロジェクト: 00001/plan9port
int
pipecmd(char *cmd, Envy *e, int *fd, Shell *sh, Word *shellcmd)
{
	int pid, pfd[2];
	int n;
	char **argv;

	if(DEBUG(D_EXEC))
		fprint(1, "pipecmd='%s'\n", cmd);/**/

	if(fd && pipe(pfd) < 0){
		mkperror("pipe");
		Exit();
	}
	pid = fork();
	if(pid < 0){
		mkperror("mk fork");
		Exit();
	}
	if(pid == 0){
		if(fd){
			close(pfd[0]);
			dup2(pfd[1], 1);
			close(pfd[1]);
		}
		if(e)
			exportenv(e, sh);
		n = shargv(shellcmd, 2, &argv);
		argv[n++] = "-c";
		argv[n++] = cmd;
		argv[n] = 0;
		execvp(argv[0], argv);
		mkperror(shell);
		_exit(1);
	}
	if(fd){
		close(pfd[1]);
		*fd = pfd[0];
	}
	return pid;
}
コード例 #3
0
ファイル: plan9.c プロジェクト: Earnestly/plan9
int
pipecmd(char *cmd, Envy *e, int *fd)
{
	int pid, pfd[2];

	if(DEBUG(D_EXEC))
		fprint(1, "pipecmd='%s'\n", cmd);/**/

	if(fd && pipe(pfd) < 0){
		perror("pipe");
		Exit();
	}
	pid = rfork(RFPROC|RFFDG|RFENVG);
	if(pid < 0){
		perror("mk fork");
		Exit();
	}
	if(pid == 0){
		if(fd){
			close(pfd[0]);
			dup(pfd[1], 1);
			close(pfd[1]);
		}
		if(e)
			exportenv(e);
		if(shflags)
			execl(shell, shellname, shflags, "-c", cmd, nil);
		else
			execl(shell, shellname, "-c", cmd, nil);
		perror(shell);
		_exits("exec");
	}
	if(fd){
		close(pfd[1]);
		*fd = pfd[0];
	}
	return pid;
}
コード例 #4
0
ファイル: plan9.c プロジェクト: Earnestly/plan9
int
execsh(char *args, char *cmd, Bufblock *buf, Envy *e)
{
	char *p;
	int tot, n, pid, in[2], out[2];

	if(buf && pipe(out) < 0){
		perror("pipe");
		Exit();
	}
	pid = rfork(RFPROC|RFFDG|RFENVG);
	if(pid < 0){
		perror("mk rfork");
		Exit();
	}
	if(pid == 0){
		if(buf)
			close(out[0]);
		if(pipe(in) < 0){
			perror("pipe");
			Exit();
		}
		pid = fork();
		if(pid < 0){
			perror("mk fork");
			Exit();
		}
		if(pid != 0){
			dup(in[0], 0);
			if(buf){
				dup(out[1], 1);
				close(out[1]);
			}
			close(in[0]);
			close(in[1]);
			if (e)
				exportenv(e);
			if(shflags)
				execl(shell, shellname, shflags, args, nil);
			else
				execl(shell, shellname, args, nil);
			perror(shell);
			_exits("exec");
		}
		close(out[1]);
		close(in[0]);
		p = cmd+strlen(cmd);
		while(cmd < p){
			n = write(in[1], cmd, p-cmd);
			if(n < 0)
				break;
			cmd += n;
		}
		close(in[1]);
		_exits(0);
	}
	if(buf){
		close(out[1]);
		tot = 0;
		for(;;){
			if (buf->current >= buf->end)
				growbuf(buf);
			n = read(out[0], buf->current, buf->end-buf->current);
			if(n <= 0)
				break;
			buf->current += n;
			tot += n;
		}
		if (tot && buf->current[-1] == '\n')
			buf->current--;
		close(out[0]);
	}
	return pid;
}
コード例 #5
0
ファイル: unix.c プロジェクト: 00001/plan9port
int
execsh(char *args, char *cmd, Bufblock *buf, Envy *e, Shell *sh, Word *shellcmd)
{
	char *p, **argv;
	int tot, n, pid, in[2], out[2];

	if(buf && pipe(out) < 0){
		mkperror("pipe");
		Exit();
	}
	pid = fork();
	mypid = getpid();
	if(pid < 0){
		mkperror("mk fork");
		Exit();
	}
	if(pid == 0){
		if(buf)
			close(out[0]);
		if(pipe(in) < 0){
			mkperror("pipe");
			Exit();
		}
		pid = fork();
		if(pid < 0){
			mkperror("mk fork");
			Exit();
		}
		if(pid != 0){
			dup2(in[0], 0);
			if(buf){
				dup2(out[1], 1);
				close(out[1]);
			}
			close(in[0]);
			close(in[1]);
			if (e)
				exportenv(e, sh);
			n = shargv(shellcmd, 1, &argv);
			argv[n++] = args;
			argv[n] = 0;
			execvp(argv[0], argv);
			mkperror(shell);
			_exit(1);
		}
		close(out[1]);
		close(in[0]);
		if(DEBUG(D_EXEC))
			fprint(1, "starting: %s\n", cmd);
		p = cmd+strlen(cmd);
		while(cmd < p){
			n = write(in[1], cmd, p-cmd);
			if(n < 0)
				break;
			cmd += n;
		}
		close(in[1]);
		_exit(0);
	}
	if(buf){
		close(out[1]);
		tot = 0;
		for(;;){
			if (buf->current >= buf->end)
				growbuf(buf);
			n = read(out[0], buf->current, buf->end-buf->current);
			if(n <= 0)
				break;
			buf->current += n;
			tot += n;
		}
		if (tot && buf->current[-1] == '\n')
			buf->current--;
		close(out[0]);
	}
	return pid;
}