xref: /plan9/sys/src/cmd/pipefile.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
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