]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/pipefile.c
abaco: cleanup, handle image/x-icon, don't use backspace as a hotkey, and remove...
[plan9front.git] / sys / src / cmd / pipefile.c
1 #include <u.h>
2 #include <libc.h>
3
4 #define TEMP    "/n/temp"
5
6 void
7 usage(void)
8 {
9         fprint(2, "usage: pipefile [-d] [-r command] [-w command] file\n");
10         exits("usage");
11 }
12
13 void
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
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 }