xref: /plan9/sys/src/cmd/tee.c (revision 54c2bd792d4fd2b6c8a639d9ff9cb2b057113e00)
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;
11 
12 char in[8192];
13 
14 int	intignore(void*, char*);
15 
16 void
main(int argc,char ** argv)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 	openf = malloc((1+argc)*sizeof(int));
42 	if(openf == nil)
43 		sysfatal("out of memory: %r");
44 
45 	n = 0;
46 	while(*argv) {
47 		if(aflag) {
48 			openf[n] = open(argv[0], OWRITE);
49 			if(openf[n] < 0)
50 				openf[n] = create(argv[0], OWRITE, 0666);
51 			seek(openf[n], 0L, 2);
52 		} else
53 			openf[n] = create(argv[0], OWRITE, 0666);
54 		if(openf[n] < 0) {
55 			fprint(2, "tee: cannot open %s: %r\n", argv[0]);
56 		} else
57 			n++;
58 		argv++;
59 	}
60 	openf[n++] = 1;
61 
62 	for(;;) {
63 		r = read(0, in, sizeof in);
64 		if(r <= 0)
65 			exits(nil);
66 		for(i=0; i<n; i++)
67 			write(openf[i], in, r);
68 	}
69 }
70 
71 int
intignore(void * a,char * msg)72 intignore(void *a, char *msg)
73 {
74 	USED(a);
75 	if(strcmp(msg, "interrupt") == 0)
76 		return 1;
77 	return 0;
78 }
79