diff options
| author | tim <tim> | 1997-05-14 15:30:41 +0000 |
|---|---|---|
| committer | Toby Goodwin <toby@paccrat.org> | 2015-05-16 21:23:00 +0100 |
| commit | 53cf1b1c1c3f0c2b5067afccc2976b99a574a089 (patch) | |
| tree | a31f167c3779362e29ab377d662052b6257253a8 /redir.c | |
| parent | b87bfedf65c289bf0ee5338c9e10492b70b1e8e0 (diff) | |
Initial revision
Diffstat (limited to 'redir.c')
| -rw-r--r-- | redir.c | 77 |
1 files changed, 0 insertions, 77 deletions
diff --git a/redir.c b/redir.c deleted file mode 100644 index b582341..0000000 --- a/redir.c +++ /dev/null @@ -1,77 +0,0 @@ -/* redir.c: code for opening files and piping heredocs after fork but before exec. */ - -#include "rc.h" - -/* - Walk the redirection queue, and open files and dup2 to them. Also, - here-documents are treated here by dumping them down a pipe. (this - should make here-documents fast on systems with lots of memory which - do pipes right. Under sh, a file is copied to /tmp, and then read - out of /tmp again. I'm interested in knowing how much faster, say, - shar runs when unpacking when invoked with rc instead of sh. On my - sun4/280, it runs in about 60-75% of the time of sh for unpacking - the rc source distribution.) -*/ - -extern void doredirs() { - List *fname; - int fd, p[2]; - Rq *r; - for (r = redirq; r != NULL; r = r->n) { - switch(r->r->type) { - default: - panic("unexpected node in doredirs"); - /* NOTREACHED */ - case nRedir: - if (r->r->u[0].i == rHerestring) { - fname = flatten(glom(r->r->u[2].p)); /* fname is really a string */ - if (pipe(p) < 0) { - uerror("pipe"); - rc_error(NULL); - } - if (rc_fork() == 0) { /* child writes to pipe */ - setsigdefaults(FALSE); - close(p[0]); - if (fname != NULL) - writeall(p[1], fname->w, strlen(fname->w)); - exit(0); - } else { - close(p[1]); - if (mvfd(p[0], r->r->u[1].i) < 0) - rc_error(NULL); - } - } else { - fname = glob(glom(r->r->u[2].p)); - if (fname == NULL) - rc_error("null filename in redirection"); - if (fname->n != NULL) - rc_error("multi-word filename in redirection"); - switch (r->r->u[0].i) { - default: - panic("unexpected node in doredirs"); - /* NOTREACHED */ - case rCreate: case rAppend: case rFrom: - fd = rc_open(fname->w, r->r->u[0].i); - break; - } - if (fd < 0) { - uerror(fname->w); - rc_error(NULL); - } - if (mvfd(fd, r->r->u[1].i) < 0) - rc_error(NULL); - } - break; - case nDup: - if (r->r->u[2].i == -1) - close(r->r->u[1].i); - else if (r->r->u[2].i != r->r->u[1].i) { - if (dup2(r->r->u[2].i, r->r->u[1].i) < 0) { - uerror("dup2"); - rc_error(NULL); - } - } - } - } - redirq = NULL; -} |