1 #include <u.h>
2 #include <libc.h>
3
4 #define TEMP "/n/temp"
5
6 void
usage(void)7 usage(void)
8 {
9 fprint(2, "usage: pipefile [-d] [-r command] [-w command] file\n");
10 exits("usage");
11 }
12
13 void
connect(char * cmd,int fd0,int fd1)14 connect(char *cmd, int fd0, int fd1)
15 {
16 switch(rfork(RFPROC|RFFDG|RFREND|RFNOWAIT)){
17 case -1:
18 sysfatal("fork %s: %r", cmd);
19 break;
20 default:
21 close(fd0);
22 close(fd1);
23 return;
24 case 0:
25 dup(fd0, 0);
26 dup(fd1, 1);
27 close(fd0);
28 close(fd1);
29 execl("/bin/rc", "rc", "-c", cmd, nil);
30 sysfatal("exec %s: %r", cmd);
31 break;
32 }
33 }
34
35 void
main(int argc,char * argv[])36 main(int argc, char *argv[])
37 {
38 char *file;
39 char *rcmd, *wcmd;
40 int fd0, fd1, ifd0, ifd1, dupflag;
41
42 rfork(RFNOTEG);
43 dupflag = 0;
44 rcmd = wcmd = nil;
45 ARGBEGIN{
46 case 'd':
47 dupflag = 1;
48 break;
49 case 'r':
50 rcmd = EARGF(usage());
51 break;
52 case 'w':
53 wcmd = EARGF(usage());
54 break;
55 default:
56 usage();
57 }ARGEND
58
59 if(argc!=1 || (rcmd==nil && wcmd==nil))
60 usage();
61 if(rcmd == nil)
62 rcmd = "/bin/cat";
63 if(wcmd == nil)
64 wcmd = "/bin/cat";
65
66 file = argv[0];
67 if(dupflag){
68 ifd0 = open(file, ORDWR);
69 if(ifd0 < 0)
70 sysfatal("open %s: %r", file);
71 ifd1 = dup(ifd0, -1);
72 }else{
73 ifd0 = open(file, OREAD);
74 if(ifd0 < 0)
75 sysfatal("open %s: %r", file);
76 ifd1 = open(file, OWRITE);
77 if(ifd1 < 0)
78 sysfatal("open %s: %r", file);
79 }
80
81 if(bind("#|", TEMP, MREPL) < 0)
82 sysfatal("bind pipe %s: %r", TEMP);
83 if(bind(TEMP "/data", file, MREPL) < 0)
84 sysfatal("bind %s %s: %r", TEMP "/data", file);
85
86 fd0 = open(TEMP "/data1", OREAD);
87 if(fd0 < 0)
88 sysfatal("open %s: %r", TEMP "/data1");
89 connect(wcmd, fd0, ifd1);
90 fd1 = open(TEMP "/data1", OWRITE);
91 if(fd1 < 0)
92 sysfatal("open %s: %r", TEMP "/data1");
93 connect(rcmd, ifd0, fd1);
94 unmount(nil, TEMP);
95 exits(nil);
96 }
97