xref: /plan9/sys/src/cmd/pipefile.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
159cc4ca5SDavid du Colombier #include <u.h>
259cc4ca5SDavid du Colombier #include <libc.h>
359cc4ca5SDavid du Colombier 
459cc4ca5SDavid du Colombier #define	TEMP	"/n/temp"
559cc4ca5SDavid du Colombier 
659cc4ca5SDavid du Colombier void
usage(void)759cc4ca5SDavid du Colombier usage(void)
859cc4ca5SDavid du Colombier {
959cc4ca5SDavid du Colombier 	fprint(2, "usage: pipefile [-d] [-r command] [-w command] file\n");
1059cc4ca5SDavid du Colombier 	exits("usage");
1159cc4ca5SDavid du Colombier }
1259cc4ca5SDavid du Colombier 
1359cc4ca5SDavid du Colombier void
connect(char * cmd,int fd0,int fd1)1459cc4ca5SDavid du Colombier connect(char *cmd, int fd0, int fd1)
1559cc4ca5SDavid du Colombier {
1659cc4ca5SDavid du Colombier 	switch(rfork(RFPROC|RFFDG|RFREND|RFNOWAIT)){
1759cc4ca5SDavid du Colombier 	case -1:
1859cc4ca5SDavid du Colombier 		sysfatal("fork %s: %r", cmd);
1959cc4ca5SDavid du Colombier 		break;
2059cc4ca5SDavid du Colombier 	default:
2159cc4ca5SDavid du Colombier 		close(fd0);
2259cc4ca5SDavid du Colombier 		close(fd1);
2359cc4ca5SDavid du Colombier 		return;
2459cc4ca5SDavid du Colombier 	case 0:
2559cc4ca5SDavid du Colombier 		dup(fd0, 0);
2659cc4ca5SDavid du Colombier 		dup(fd1, 1);
2759cc4ca5SDavid du Colombier 		close(fd0);
2859cc4ca5SDavid du Colombier 		close(fd1);
2959cc4ca5SDavid du Colombier 		execl("/bin/rc", "rc", "-c", cmd, nil);
3059cc4ca5SDavid du Colombier 		sysfatal("exec %s: %r", cmd);
3159cc4ca5SDavid du Colombier 		break;
3259cc4ca5SDavid du Colombier 	}
3359cc4ca5SDavid du Colombier }
3459cc4ca5SDavid du Colombier 
3559cc4ca5SDavid du Colombier void
main(int argc,char * argv[])3659cc4ca5SDavid du Colombier main(int argc, char *argv[])
3759cc4ca5SDavid du Colombier {
3859cc4ca5SDavid du Colombier 	char *file;
3959cc4ca5SDavid du Colombier 	char *rcmd, *wcmd;
4059cc4ca5SDavid du Colombier 	int fd0, fd1, ifd0, ifd1, dupflag;
4159cc4ca5SDavid du Colombier 
42*9a747e4fSDavid du Colombier 	rfork(RFNOTEG);
4359cc4ca5SDavid du Colombier 	dupflag = 0;
4459cc4ca5SDavid du Colombier 	rcmd = wcmd = nil;
4559cc4ca5SDavid du Colombier 	ARGBEGIN{
4659cc4ca5SDavid du Colombier 	case 'd':
4759cc4ca5SDavid du Colombier 		dupflag = 1;
4859cc4ca5SDavid du Colombier 		break;
4959cc4ca5SDavid du Colombier 	case 'r':
5059cc4ca5SDavid du Colombier 		rcmd = EARGF(usage());
5159cc4ca5SDavid du Colombier 		break;
5259cc4ca5SDavid du Colombier 	case 'w':
5359cc4ca5SDavid du Colombier 		wcmd = EARGF(usage());
5459cc4ca5SDavid du Colombier 		break;
5559cc4ca5SDavid du Colombier 	default:
5659cc4ca5SDavid du Colombier 		usage();
5759cc4ca5SDavid du Colombier 	}ARGEND
5859cc4ca5SDavid du Colombier 
5959cc4ca5SDavid du Colombier 	if(argc!=1 || (rcmd==nil && wcmd==nil))
6059cc4ca5SDavid du Colombier 		usage();
6159cc4ca5SDavid du Colombier 	if(rcmd == nil)
6259cc4ca5SDavid du Colombier 		rcmd = "/bin/cat";
6359cc4ca5SDavid du Colombier 	if(wcmd == nil)
6459cc4ca5SDavid du Colombier 		wcmd = "/bin/cat";
6559cc4ca5SDavid du Colombier 
6659cc4ca5SDavid du Colombier 	file = argv[0];
6759cc4ca5SDavid du Colombier 	if(dupflag){
6859cc4ca5SDavid du Colombier 		ifd0 = open(file, ORDWR);
6959cc4ca5SDavid du Colombier 		if(ifd0 < 0)
7059cc4ca5SDavid du Colombier 			sysfatal("open %s: %r", file);
7159cc4ca5SDavid du Colombier 		ifd1 = dup(ifd0, -1);
7259cc4ca5SDavid du Colombier 	}else{
7359cc4ca5SDavid du Colombier 		ifd0 = open(file, OREAD);
7459cc4ca5SDavid du Colombier 		if(ifd0 < 0)
7559cc4ca5SDavid du Colombier 			sysfatal("open %s: %r", file);
7659cc4ca5SDavid du Colombier 		ifd1 = open(file, OWRITE);
7759cc4ca5SDavid du Colombier 		if(ifd1 < 0)
7859cc4ca5SDavid du Colombier 			sysfatal("open %s: %r", file);
7959cc4ca5SDavid du Colombier 	}
8059cc4ca5SDavid du Colombier 
8159cc4ca5SDavid du Colombier 	if(bind("#|", TEMP, MREPL) < 0)
8259cc4ca5SDavid du Colombier 		sysfatal("bind pipe %s: %r", TEMP);
8359cc4ca5SDavid du Colombier 	if(bind(TEMP "/data", file, MREPL) < 0)
8459cc4ca5SDavid du Colombier 		sysfatal("bind %s %s: %r", TEMP "/data", file);
8559cc4ca5SDavid du Colombier 
8659cc4ca5SDavid du Colombier 	fd0 = open(TEMP "/data1", OREAD);
8759cc4ca5SDavid du Colombier 	if(fd0 < 0)
8859cc4ca5SDavid du Colombier 		sysfatal("open %s: %r", TEMP "/data1");
8959cc4ca5SDavid du Colombier 	connect(wcmd, fd0, ifd1);
9059cc4ca5SDavid du Colombier 	fd1 = open(TEMP "/data1", OWRITE);
9159cc4ca5SDavid du Colombier 	if(fd1 < 0)
9259cc4ca5SDavid du Colombier 		sysfatal("open %s: %r", TEMP "/data1");
9359cc4ca5SDavid du Colombier 	connect(rcmd, ifd0, fd1);
9459cc4ca5SDavid du Colombier 	unmount(nil, TEMP);
9559cc4ca5SDavid du Colombier 	exits(nil);
9659cc4ca5SDavid du Colombier }
97