blob: 83db8a08f399dada560e4a6136c023593f056a84 [file] [log] [blame]
rscbc7cb1a2003-11-23 18:04:47 +00001/*
2 * tee-- pipe fitting
3 */
4
5#include <u.h>
6#include <libc.h>
7
8int uflag;
9int aflag;
10int openf[100];
11
12char in[8192];
13
14int intignore(void*, char*);
15
16void
17main(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 USED(argc);
42 n = 0;
43 while(*argv) {
44 if(aflag) {
45 openf[n] = open(argv[0], OWRITE);
46 if(openf[n] < 0)
47 openf[n] = create(argv[0], OWRITE, 0666);
48 seek(openf[n], 0L, 2);
49 } else
50 openf[n] = create(argv[0], OWRITE, 0666);
51 if(openf[n] < 0) {
52 fprint(2, "tee: cannot open %s: %r\n", argv[0]);
53 } else
54 n++;
55 argv++;
56 }
57 openf[n++] = 1;
58
59 for(;;) {
60 r = read(0, in, sizeof in);
61 if(r <= 0)
62 exits(nil);
63 for(i=0; i<n; i++)
64 write(openf[i], in, r);
65 }
66}
67
68int
69intignore(void *a, char *msg)
70{
71 USED(a);
72 if(strcmp(msg, "interrupt") == 0)
73 return 1;
74 return 0;
75}