xref: /plan9-contrib/sys/src/cmd/tee.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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, j;
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 		break;
34 	ARGEND }
35 
36 	USED(argc);
37 	n = 0;
38 	while(*argv) {
39 		if(aflag) {
40 			openf[n] = open(argv[0], OWRITE);
41 			if(openf[n] < 0)
42 				openf[n] = create(argv[0], OWRITE, 0666);
43 			seek(openf[n], 0L, 2);
44 		} else
45 			openf[n] = create(argv[0], OWRITE, 0666);
46 		if(openf[n] < 0) {
47 			fprint(2, "tee: cannot open %s: ", argv[0]);
48 			perror("");
49 		} else
50 			n++;
51 		argv++;
52 	}
53 	openf[n++] = 1;
54 
55 	for(;;) {
56 		r = read(0, in, sizeof in);
57 		if(r <= 0)
58 			exits(0);
59 		if(uflag) {
60 			for(j=0; j<r; j++)
61 			for(i=0; i<n; i++)
62 				write(openf[i], &in[j], 1);
63 		} else
64 		for(i=0; i<n; i++)
65 			write(openf[i], in, r);
66 	}
67 }
68 
69 int
70 intignore(void *a, char *msg)
71 {
72 	USED(a);
73 	if(strcmp(msg, "interrupt") == 0)
74 		return 1;
75 	return 0;
76 }
77