pipefile.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <u.h>
  2. #include <libc.h>
  3. #define TEMP "/n/temp"
  4. void
  5. usage(void)
  6. {
  7. fprint(2, "usage: pipefile [-d] [-r command] [-w command] file\n");
  8. exits("usage");
  9. }
  10. void
  11. connect(char *cmd, int fd0, int fd1)
  12. {
  13. switch(rfork(RFPROC|RFFDG|RFREND|RFNOWAIT)){
  14. case -1:
  15. sysfatal("fork %s: %r", cmd);
  16. break;
  17. default:
  18. close(fd0);
  19. close(fd1);
  20. return;
  21. case 0:
  22. dup(fd0, 0);
  23. dup(fd1, 1);
  24. close(fd0);
  25. close(fd1);
  26. execl("/bin/rc", "rc", "-c", cmd, nil);
  27. sysfatal("exec %s: %r", cmd);
  28. break;
  29. }
  30. }
  31. void
  32. main(int argc, char *argv[])
  33. {
  34. char *file;
  35. char *rcmd, *wcmd;
  36. int fd0, fd1, ifd0, ifd1, dupflag;
  37. rfork(RFNOTEG);
  38. dupflag = 0;
  39. rcmd = wcmd = nil;
  40. ARGBEGIN{
  41. case 'd':
  42. dupflag = 1;
  43. break;
  44. case 'r':
  45. rcmd = EARGF(usage());
  46. break;
  47. case 'w':
  48. wcmd = EARGF(usage());
  49. break;
  50. default:
  51. usage();
  52. }ARGEND
  53. if(argc!=1 || (rcmd==nil && wcmd==nil))
  54. usage();
  55. if(rcmd == nil)
  56. rcmd = "/bin/cat";
  57. if(wcmd == nil)
  58. wcmd = "/bin/cat";
  59. file = argv[0];
  60. if(dupflag){
  61. ifd0 = open(file, ORDWR);
  62. if(ifd0 < 0)
  63. sysfatal("open %s: %r", file);
  64. ifd1 = dup(ifd0, -1);
  65. }else{
  66. ifd0 = open(file, OREAD);
  67. if(ifd0 < 0)
  68. sysfatal("open %s: %r", file);
  69. ifd1 = open(file, OWRITE);
  70. if(ifd1 < 0)
  71. sysfatal("open %s: %r", file);
  72. }
  73. if(bind("#|", TEMP, MREPL) < 0)
  74. sysfatal("bind pipe %s: %r", TEMP);
  75. if(bind(TEMP "/data", file, MREPL) < 0)
  76. sysfatal("bind %s %s: %r", TEMP "/data", file);
  77. fd0 = open(TEMP "/data1", OREAD);
  78. if(fd0 < 0)
  79. sysfatal("open %s: %r", TEMP "/data1");
  80. connect(wcmd, fd0, ifd1);
  81. fd1 = open(TEMP "/data1", OWRITE);
  82. if(fd1 < 0)
  83. sysfatal("open %s: %r", TEMP "/data1");
  84. connect(rcmd, ifd0, fd1);
  85. unmount(nil, TEMP);
  86. exits(nil);
  87. }