summaryrefslogtreecommitdiff
path: root/sys/src/cmd/pipefile.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/pipefile.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/pipefile.c')
-rwxr-xr-xsys/src/cmd/pipefile.c96
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);
+}