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; }
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; }
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; }
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; }
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; }