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 } 97