]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/tee.c
vmx: reset virtio queue state on device reset
[plan9front.git] / sys / src / cmd / tee.c
1 /*
2  * tee-- pipe fitting
3  */
4
5 #include <u.h>
6 #include <libc.h>
7
8 enum {
9         FDSTART = 3,
10 };
11
12 int     uflag;
13 int     aflag;
14
15 char in[8192];
16
17 int     intignore(void*, char*);
18
19 void
20 main(int argc, char **argv)
21 {
22         int i;
23         int r, n;
24
25         ARGBEGIN {
26         case 'a':
27                 aflag++;
28                 break;
29
30         case 'i':
31                 atnotify(intignore, 1);
32                 break;
33
34         case 'u':
35                 uflag++;
36                 /* uflag is ignored and undocumented; it's a relic from Unix */
37                 break;
38
39         default:
40                 fprint(2, "usage: tee [-ai] [file ...]\n");
41                 exits("usage");
42         } ARGEND
43
44         USED(argc);
45         n = 0;
46         while(*argv) {
47                 if(aflag) {
48                         i = open(argv[0], OWRITE);
49                         if(i < 0)
50                                 i = create(argv[0], OWRITE, 0666);
51                         seek(i, 0L, 2);
52                 } else
53                         i = create(argv[0], OWRITE, 0666);
54                 if(i < 0) {
55                         fprint(2, "tee: cannot open %s: %r\n", argv[0]);
56                 } else {
57                         if(i != n+FDSTART)
58                                 dup(i, n+FDSTART);
59                         n++;
60                 }
61                 argv++;
62         }
63
64         for(;;) {
65                 r = read(0, in, sizeof in);
66                 if(r <= 0)
67                         exits(nil);
68                 for(i=0; i<n; i++)
69                         write(i+FDSTART, in, r);
70                 write(1, in, r);
71         }
72 }
73
74 int
75 intignore(void *a, char *msg)
76 {
77         USED(a);
78         if(strcmp(msg, "interrupt") == 0)
79                 return 1;
80         return 0;
81 }