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[100]; 11 12 char in[8192]; 13 14 int intignore(void*, char*); 15 16 void 17 main(int argc, char **argv) 18 { 19 int i, j; 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 break; 34 ARGEND } 35 36 USED(argc); 37 n = 0; 38 while(*argv) { 39 if(aflag) { 40 openf[n] = open(argv[0], OWRITE); 41 if(openf[n] < 0) 42 openf[n] = create(argv[0], OWRITE, 0666); 43 seek(openf[n], 0L, 2); 44 } else 45 openf[n] = create(argv[0], OWRITE, 0666); 46 if(openf[n] < 0) { 47 fprint(2, "tee: cannot open %s: ", argv[0]); 48 perror(""); 49 } else 50 n++; 51 argv++; 52 } 53 openf[n++] = 1; 54 55 for(;;) { 56 r = read(0, in, sizeof in); 57 if(r <= 0) 58 exits(0); 59 if(uflag) { 60 for(j=0; j<r; j++) 61 for(i=0; i<n; i++) 62 write(openf[i], &in[j], 1); 63 } else 64 for(i=0; i<n; i++) 65 write(openf[i], in, r); 66 } 67 } 68 69 int 70 intignore(void *a, char *msg) 71 { 72 USED(a); 73 if(strcmp(msg, "interrupt") == 0) 74 return 1; 75 return 0; 76 } 77