123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #include <u.h>
- #include <libc.h>
- #define TEMP "/n/temp"
- void
- usage(void)
- {
- fprint(2, "usage: pipefile [-d] [-r command] [-w command] file\n");
- exits("usage");
- }
- void
- connect(char *cmd, int fd0, int fd1)
- {
- switch(rfork(RFPROC|RFFDG|RFREND|RFNOWAIT)){
- case -1:
- sysfatal("fork %s: %r", cmd);
- break;
- default:
- close(fd0);
- close(fd1);
- return;
- case 0:
- dup(fd0, 0);
- dup(fd1, 1);
- close(fd0);
- close(fd1);
- execl("/bin/rc", "rc", "-c", cmd, nil);
- sysfatal("exec %s: %r", cmd);
- break;
- }
- }
- void
- main(int argc, char *argv[])
- {
- char *file;
- char *rcmd, *wcmd;
- int fd0, fd1, ifd0, ifd1, dupflag;
- rfork(RFNOTEG);
- dupflag = 0;
- rcmd = wcmd = nil;
- ARGBEGIN{
- case 'd':
- dupflag = 1;
- break;
- case 'r':
- rcmd = EARGF(usage());
- break;
- case 'w':
- wcmd = EARGF(usage());
- break;
- default:
- usage();
- }ARGEND
- if(argc!=1 || (rcmd==nil && wcmd==nil))
- usage();
- if(rcmd == nil)
- rcmd = "/bin/cat";
- if(wcmd == nil)
- wcmd = "/bin/cat";
- file = argv[0];
- if(dupflag){
- ifd0 = open(file, ORDWR);
- if(ifd0 < 0)
- sysfatal("open %s: %r", file);
- ifd1 = dup(ifd0, -1);
- }else{
- ifd0 = open(file, OREAD);
- if(ifd0 < 0)
- sysfatal("open %s: %r", file);
- ifd1 = open(file, OWRITE);
- if(ifd1 < 0)
- sysfatal("open %s: %r", file);
- }
- if(bind("#|", TEMP, MREPL) < 0)
- sysfatal("bind pipe %s: %r", TEMP);
- if(bind(TEMP "/data", file, MREPL) < 0)
- sysfatal("bind %s %s: %r", TEMP "/data", file);
- fd0 = open(TEMP "/data1", OREAD);
- if(fd0 < 0)
- sysfatal("open %s: %r", TEMP "/data1");
- connect(wcmd, fd0, ifd1);
- fd1 = open(TEMP "/data1", OWRITE);
- if(fd1 < 0)
- sysfatal("open %s: %r", TEMP "/data1");
- connect(rcmd, ifd0, fd1);
- unmount(nil, TEMP);
- exits(nil);
- }
|