diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/pipefile.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/pipefile.c')
-rwxr-xr-x | sys/src/cmd/pipefile.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/sys/src/cmd/pipefile.c b/sys/src/cmd/pipefile.c new file mode 100755 index 000000000..3c4f4dd75 --- /dev/null +++ b/sys/src/cmd/pipefile.c @@ -0,0 +1,96 @@ +#include <u.h> +#include <libc.h> + +#define TEMP "/n/temp" + +void +usage(void) +{ + fprint(2, "usage: pipefile [-d] [-r command] [-w command] file\n"); + exits("usage"); +} + +void +connect(char *cmd, int fd0, int fd1) +{ + switch(rfork(RFPROC|RFFDG|RFREND|RFNOWAIT)){ + case -1: + sysfatal("fork %s: %r", cmd); + break; + default: + close(fd0); + close(fd1); + return; + case 0: + dup(fd0, 0); + dup(fd1, 1); + close(fd0); + close(fd1); + execl("/bin/rc", "rc", "-c", cmd, nil); + sysfatal("exec %s: %r", cmd); + break; + } +} + +void +main(int argc, char *argv[]) +{ + char *file; + char *rcmd, *wcmd; + int fd0, fd1, ifd0, ifd1, dupflag; + + rfork(RFNOTEG); + dupflag = 0; + rcmd = wcmd = nil; + ARGBEGIN{ + case 'd': + dupflag = 1; + break; + case 'r': + rcmd = EARGF(usage()); + break; + case 'w': + wcmd = EARGF(usage()); + break; + default: + usage(); + }ARGEND + + if(argc!=1 || (rcmd==nil && wcmd==nil)) + usage(); + if(rcmd == nil) + rcmd = "/bin/cat"; + if(wcmd == nil) + wcmd = "/bin/cat"; + + file = argv[0]; + if(dupflag){ + ifd0 = open(file, ORDWR); + if(ifd0 < 0) + sysfatal("open %s: %r", file); + ifd1 = dup(ifd0, -1); + }else{ + ifd0 = open(file, OREAD); + if(ifd0 < 0) + sysfatal("open %s: %r", file); + ifd1 = open(file, OWRITE); + if(ifd1 < 0) + sysfatal("open %s: %r", file); + } + + if(bind("#|", TEMP, MREPL) < 0) + sysfatal("bind pipe %s: %r", TEMP); + if(bind(TEMP "/data", file, MREPL) < 0) + sysfatal("bind %s %s: %r", TEMP "/data", file); + + fd0 = open(TEMP "/data1", OREAD); + if(fd0 < 0) + sysfatal("open %s: %r", TEMP "/data1"); + connect(wcmd, fd0, ifd1); + fd1 = open(TEMP "/data1", OWRITE); + if(fd1 < 0) + sysfatal("open %s: %r", TEMP "/data1"); + connect(rcmd, ifd0, fd1); + unmount(nil, TEMP); + exits(nil); +} |