/* | |
* 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; | |
} |