]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/tee.c
cpu: make -p work with explicit service in dialstring (same as import)
[plan9front.git] / sys / src / cmd / tee.c
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;
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
68 int
69 intignore(void *a, char *msg)
70 {
71         USED(a);
72         if(strcmp(msg, "interrupt") == 0)
73                 return 1;
74         return 0;
75 }