Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}