tee.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * tee-- pipe fitting
  3. */
  4. #include <u.h>
  5. #include <libc.h>
  6. int uflag;
  7. int aflag;
  8. int *openf;
  9. char in[8192];
  10. int intignore(void*, char*);
  11. void
  12. main(int argc, char **argv)
  13. {
  14. int i;
  15. int r, n;
  16. ARGBEGIN {
  17. case 'a':
  18. aflag++;
  19. break;
  20. case 'i':
  21. atnotify(intignore, 1);
  22. break;
  23. case 'u':
  24. uflag++;
  25. /* uflag is ignored and undocumented; it's a relic from Unix */
  26. break;
  27. default:
  28. fprint(2, "usage: tee [-ai] [file ...]\n");
  29. exits("usage");
  30. } ARGEND
  31. openf = malloc((1+argc)*sizeof(int));
  32. if(openf == nil)
  33. sysfatal("out of memory: %r");
  34. n = 0;
  35. while(*argv) {
  36. if(aflag) {
  37. openf[n] = open(argv[0], OWRITE);
  38. if(openf[n] < 0)
  39. openf[n] = create(argv[0], OWRITE, 0666);
  40. seek(openf[n], 0L, 2);
  41. } else
  42. openf[n] = create(argv[0], OWRITE, 0666);
  43. if(openf[n] < 0) {
  44. fprint(2, "tee: cannot open %s: %r\n", argv[0]);
  45. } else
  46. n++;
  47. argv++;
  48. }
  49. openf[n++] = 1;
  50. for(;;) {
  51. r = read(0, in, sizeof in);
  52. if(r <= 0)
  53. exits(nil);
  54. for(i=0; i<n; i++)
  55. write(openf[i], in, r);
  56. }
  57. }
  58. int
  59. intignore(void *a, char *msg)
  60. {
  61. USED(a);
  62. if(strcmp(msg, "interrupt") == 0)
  63. return 1;
  64. return 0;
  65. }