2 bc7cb1a1 2003-11-23 devnull * tee-- pipe fitting
5 bc7cb1a1 2003-11-23 devnull #include <u.h>
6 bc7cb1a1 2003-11-23 devnull #include <libc.h>
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];
12 bc7cb1a1 2003-11-23 devnull char in[8192];
14 bc7cb1a1 2003-11-23 devnull int intignore(void*, char*);
17 bc7cb1a1 2003-11-23 devnull main(int argc, char **argv)
20 bc7cb1a1 2003-11-23 devnull int r, n;
22 bc7cb1a1 2003-11-23 devnull ARGBEGIN {
23 bc7cb1a1 2003-11-23 devnull case 'a':
27 bc7cb1a1 2003-11-23 devnull case 'i':
28 bc7cb1a1 2003-11-23 devnull atnotify(intignore, 1);
31 bc7cb1a1 2003-11-23 devnull case 'u':
33 bc7cb1a1 2003-11-23 devnull /* uflag is ignored and undocumented; it's a relic from Unix */
37 bc7cb1a1 2003-11-23 devnull fprint(2, "usage: tee [-ai] [file ...]\n");
38 bc7cb1a1 2003-11-23 devnull exits("usage");
41 bc7cb1a1 2003-11-23 devnull USED(argc);
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);
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]);
57 bc7cb1a1 2003-11-23 devnull openf[n++] = 1;
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);
69 bc7cb1a1 2003-11-23 devnull intignore(void *a, char *msg)
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;