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