Blame


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