| /* |
| * tee-- pipe fitting |
| */ |
| |
| #include <u.h> |
| #include <libc.h> |
| |
| int uflag; |
| int aflag; |
| int openf[100]; |
| |
| char in[8192]; |
| |
| int intignore(void*, char*); |
| |
| void |
| main(int argc, char **argv) |
| { |
| int i; |
| int r, n; |
| |
| ARGBEGIN { |
| case 'a': |
| aflag++; |
| break; |
| |
| case 'i': |
| atnotify(intignore, 1); |
| break; |
| |
| case 'u': |
| uflag++; |
| /* uflag is ignored and undocumented; it's a relic from Unix */ |
| break; |
| |
| default: |
| fprint(2, "usage: tee [-ai] [file ...]\n"); |
| exits("usage"); |
| } ARGEND |
| |
| USED(argc); |
| n = 0; |
| while(*argv) { |
| if(aflag) { |
| openf[n] = open(argv[0], OWRITE); |
| if(openf[n] < 0) |
| openf[n] = create(argv[0], OWRITE, 0666); |
| seek(openf[n], 0L, 2); |
| } else |
| openf[n] = create(argv[0], OWRITE, 0666); |
| if(openf[n] < 0) { |
| fprint(2, "tee: cannot open %s: %r\n", argv[0]); |
| } else |
| n++; |
| argv++; |
| } |
| openf[n++] = 1; |
| |
| for(;;) { |
| r = read(0, in, sizeof in); |
| if(r <= 0) |
| exits(nil); |
| for(i=0; i<n; i++) |
| write(openf[i], in, r); |
| } |
| } |
| |
| int |
| intignore(void *a, char *msg) |
| { |
| USED(a); |
| if(strcmp(msg, "interrupt") == 0) |
| return 1; |
| return 0; |
| } |