/* * Perform io redirection. * We may or maynot be forked here. */ static void doio(struct command *t, int *pipein, int *pipeout) { int fd; Char *cp; unsigned long flags = t->t_dflg; if (didfds || (flags & F_REPEAT)) return; if ((flags & F_READ) == 0) {/* F_READ already done */ if (t->t_dlef) { char *tmp; /* * so < /dev/std{in,out,err} work */ (void) dcopy(SHIN, 0); (void) dcopy(SHOUT, 1); (void) dcopy(SHDIAG, 2); cp = splicepipe(t, t->t_dlef); tmp = strsave(short2str(cp)); xfree(cp); cleanup_push(tmp, xfree); if ((fd = xopen(tmp, O_RDONLY|O_LARGEFILE)) < 0) stderror(ERR_SYSTEM, tmp, strerror(errno)); cleanup_until(tmp); /* allow input files larger than 2Gb */ #ifndef WINNT_NATIVE (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_LARGEFILE); #endif /*!WINNT_NATIVE*/ (void) dmove(fd, 0); } else if (flags & F_PIPEIN) { xclose(0); TCSH_IGNORE(dup(pipein[0])); xclose(pipein[0]); xclose(pipein[1]); } else if ((flags & F_NOINTERRUPT) && tpgrp == -1) { xclose(0); (void) xopen(_PATH_DEVNULL, O_RDONLY|O_LARGEFILE); } else { xclose(0); TCSH_IGNORE(dup(OLDSTD)); #if defined(CLOSE_ON_EXEC) && defined(CLEX_DUPS) /* * PWP: Unlike Bezerkeley 4.3, FIONCLEX for Pyramid is preserved * across dup()s, so we have to UNSET it here or else we get a * command with NO stdin, stdout, or stderr at all (a bad thing * indeed) */ (void) close_on_exec(0, 0); #endif /* CLOSE_ON_EXEC && CLEX_DUPS */ } } if (t->t_drit) { char *tmp; cp = splicepipe(t, t->t_drit); tmp = strsave(short2str(cp)); xfree(cp); cleanup_push(tmp, xfree); /* * so > /dev/std{out,err} work */ (void) dcopy(SHOUT, 1); (void) dcopy(SHDIAG, 2); if ((flags & F_APPEND) != 0) { #ifdef O_APPEND fd = xopen(tmp, O_WRONLY|O_APPEND|O_LARGEFILE); #else /* !O_APPEND */ fd = xopen(tmp, O_WRONLY|O_LARGEFILE); (void) lseek(fd, (off_t) 0, L_XTND); #endif /* O_APPEND */ } else fd = 0; if ((flags & F_APPEND) == 0 || fd == -1) { if (!(flags & F_OVERWRITE) && adrof(STRnoclobber)) { if (flags & F_APPEND) stderror(ERR_SYSTEM, tmp, strerror(errno)); chkclob(tmp); } if ((fd = xcreat(tmp, 0666)) < 0) stderror(ERR_SYSTEM, tmp, strerror(errno)); /* allow input files larger than 2Gb */ #ifndef WINNT_NATIVE (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_LARGEFILE); #endif /*!WINNT_NATIVE*/ } cleanup_until(tmp); (void) dmove(fd, 1); is1atty = isatty(1); } else if (flags & F_PIPEOUT) { xclose(1); TCSH_IGNORE(dup(pipeout[1])); is1atty = 0; } else { xclose(1); TCSH_IGNORE(dup(SHOUT)); is1atty = isoutatty; # if defined(CLOSE_ON_EXEC) && defined(CLEX_DUPS) (void) close_on_exec(1, 0); # endif /* CLOSE_ON_EXEC && CLEX_DUPS */ } xclose(2); if (flags & F_STDERR) { TCSH_IGNORE(dup(1)); is2atty = is1atty; } else { TCSH_IGNORE(dup(SHDIAG)); is2atty = isdiagatty; # if defined(CLOSE_ON_EXEC) && defined(CLEX_DUPS) (void) close_on_exec(2, 0); # endif /* CLOSE_ON_EXEC && CLEX_DUPS */ } didfds = 1; }
/* * Perform io redirection. * We may or maynot be forked here. */ static void doio(struct command *t, int *pipein, int *pipeout) { Char *cp; int fd, flags; flags = t->t_dflg; if (didfds || (flags & F_REPEAT)) return; if ((flags & F_READ) == 0) {/* F_READ already done */ if (t->t_dlef) { char tmp[MAXPATHLEN+1]; /* * so < /dev/std{in,out,err} work */ (void)dcopy(SHIN, 0); (void)dcopy(SHOUT, 1); (void)dcopy(SHERR, 2); cp = splicepipe(t, t->t_dlef); (void)strlcpy(tmp, short2str(cp), sizeof(tmp)); xfree((ptr_t) cp); if ((fd = open(tmp, O_RDONLY)) < 0) { stderror(ERR_SYSTEM, tmp, strerror(errno)); /* NOTREACHED */ } (void)dmove(fd, 0); } else if (flags & F_PIPEIN) { (void)close(0); (void)dup(pipein[0]); (void)close(pipein[0]); (void)close(pipein[1]); } else if ((flags & F_NOINTERRUPT) && tpgrp == -1) { (void)close(0); (void)open(_PATH_DEVNULL, O_RDONLY); } else { (void)close(0); (void)dup(OLDSTD); (void)ioctl(0, FIONCLEX, NULL); } } if (t->t_drit) { char tmp[MAXPATHLEN+1]; cp = splicepipe(t, t->t_drit); (void)strlcpy(tmp, short2str(cp), sizeof(tmp)); xfree((ptr_t) cp); /* * so > /dev/std{out,err} work */ (void)dcopy(SHOUT, 1); (void)dcopy(SHERR, 2); if ((flags & F_APPEND) && #ifdef O_APPEND (fd = open(tmp, O_WRONLY | O_APPEND)) >= 0); #else (fd = open(tmp, O_WRONLY)) >= 0) (void)lseek(1, (off_t) 0, SEEK_END); #endif else { if (!(flags & F_OVERWRITE) && adrof(STRnoclobber)) {
/* * Perform io redirection. * We may or maynot be forked here. */ static void doio(struct command *t, int *pipein, int *pipeout) { int fd; Char *cp; int flags = t->t_dflg; if (didfds || (flags & F_REPEAT)) return; if ((flags & F_READ) == 0) {/* F_READ already done */ if (t->t_dlef) { char tmp[PATH_MAX]; /* * so < /dev/std{in,out,err} work */ (void) dcopy(SHIN, 0); (void) dcopy(SHOUT, 1); (void) dcopy(SHERR, 2); cp = splicepipe(t, t->t_dlef); strlcpy(tmp, short2str(cp), sizeof tmp); xfree(cp); if ((fd = open(tmp, O_RDONLY)) < 0) stderror(ERR_SYSTEM, tmp, strerror(errno)); (void) dmove(fd, 0); } else if (flags & F_PIPEIN) { (void) close(0); (void) dup(pipein[0]); (void) close(pipein[0]); (void) close(pipein[1]); } else if ((flags & F_NOINTERRUPT) && tpgrp == -1) { (void) close(0); (void) open(_PATH_DEVNULL, O_RDONLY); } else { (void) close(0); (void) dup(OLDSTD); (void) ioctl(STDIN_FILENO, FIONCLEX, NULL); } } if (t->t_drit) { char tmp[PATH_MAX]; cp = splicepipe(t, t->t_drit); strlcpy(tmp, short2str(cp), sizeof tmp); xfree(cp); /* * so > /dev/std{out,err} work */ (void) dcopy(SHOUT, 1); (void) dcopy(SHERR, 2); if ((flags & F_APPEND) && (fd = open(tmp, O_WRONLY | O_APPEND)) >= 0); else { if (!(flags & F_OVERWRITE) && adrof(STRnoclobber)) { if (flags & F_APPEND) stderror(ERR_SYSTEM, tmp, strerror(errno)); chkclob(tmp); } if ((fd = open(tmp, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) stderror(ERR_SYSTEM, tmp, strerror(errno)); } (void) dmove(fd, 1); } else if (flags & F_PIPEOUT) { (void) close(1); (void) dup(pipeout[1]); } else { (void) close(1); (void) dup(SHOUT); (void) ioctl(STDOUT_FILENO, FIONCLEX, NULL); } (void) close(2); if (flags & F_STDERR) { (void) dup(1); } else { (void) dup(SHERR); (void) ioctl(STDERR_FILENO, FIONCLEX, NULL); } didfds = 1; }