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
main(int argc,char ** argv)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
intignore(void * a,char * msg)72 intignore(void *a, char *msg)
73 {
74 USED(a);
75 if(strcmp(msg, "interrupt") == 0)
76 return 1;
77 return 0;
78 }
79