xref: /csrg-svn/usr.bin/tee/tee.c (revision 1123)
1*1123Sbill static char *sccsid = "@(#)tee.c	4.1 (Berkeley) 10/01/80";
2*1123Sbill /*
3*1123Sbill  * tee-- pipe fitting
4*1123Sbill  */
5*1123Sbill 
6*1123Sbill #include <signal.h>
7*1123Sbill #include <sys/types.h>
8*1123Sbill #include <sys/stat.h>
9*1123Sbill #include <errno.h>
10*1123Sbill #include <pagsiz.h>
11*1123Sbill 
12*1123Sbill #define	BUFSIZ	BSIZE
13*1123Sbill int openf[20] = { 1 };
14*1123Sbill int n = 1;
15*1123Sbill int t = 0;
16*1123Sbill int aflag;
17*1123Sbill 
18*1123Sbill char in[BUFSIZ];
19*1123Sbill 
20*1123Sbill char out[BUFSIZ];
21*1123Sbill 
22*1123Sbill extern errno;
23*1123Sbill long	lseek();
24*1123Sbill 
25*1123Sbill main(argc,argv)
26*1123Sbill char **argv;
27*1123Sbill {
28*1123Sbill 	int register r,w,p;
29*1123Sbill 	struct stat buf;
30*1123Sbill 	while(argc>1&&argv[1][0]=='-') {
31*1123Sbill 		switch(argv[1][1]) {
32*1123Sbill 		case 'a':
33*1123Sbill 			aflag++;
34*1123Sbill 			break;
35*1123Sbill 		case 'i':
36*1123Sbill 		case 0:
37*1123Sbill 			signal(SIGINT, SIG_IGN);
38*1123Sbill 		}
39*1123Sbill 		argv++;
40*1123Sbill 		argc--;
41*1123Sbill 	}
42*1123Sbill 	fstat(1,&buf);
43*1123Sbill 	t = (buf.st_mode&S_IFMT)==S_IFCHR;
44*1123Sbill 	if(lseek(1,0L,1)==-1&&errno==ESPIPE)
45*1123Sbill 		t++;
46*1123Sbill 	while(argc-->1) {
47*1123Sbill 		if(aflag) {
48*1123Sbill 			openf[n] = open(argv[1],1);
49*1123Sbill 			if(openf[n] < 0)
50*1123Sbill 				openf[n] = creat(argv[1],0666);
51*1123Sbill 			lseek(openf[n++],0L,2);
52*1123Sbill 		} else
53*1123Sbill 			openf[n++] = creat(argv[1],0666);
54*1123Sbill 		if(stat(argv[1],&buf)>=0) {
55*1123Sbill 			if((buf.st_mode&S_IFMT)==S_IFCHR)
56*1123Sbill 				t++;
57*1123Sbill 		} else {
58*1123Sbill 			puts("tee: cannot open ");
59*1123Sbill 			puts(argv[1]);
60*1123Sbill 			puts("\n");
61*1123Sbill 			n--;
62*1123Sbill 		}
63*1123Sbill 		argv++;
64*1123Sbill 	}
65*1123Sbill 	r = w = 0;
66*1123Sbill 	for(;;) {
67*1123Sbill 		for(p=0;p<BUFSIZ;) {
68*1123Sbill 			if(r>=w) {
69*1123Sbill 				if(t>0&&p>0) break;
70*1123Sbill 				w = read(0,in,BUFSIZ);
71*1123Sbill 				r = 0;
72*1123Sbill 				if(w<=0) {
73*1123Sbill 					stash(p);
74*1123Sbill 					return;
75*1123Sbill 				}
76*1123Sbill 			}
77*1123Sbill 			out[p++] = in[r++];
78*1123Sbill 		}
79*1123Sbill 		stash(p);
80*1123Sbill 	}
81*1123Sbill }
82*1123Sbill 
83*1123Sbill stash(p)
84*1123Sbill {
85*1123Sbill 	int k;
86*1123Sbill 	int i;
87*1123Sbill 	int d;
88*1123Sbill 	d = t ? 16 : p;
89*1123Sbill 	for(i=0; i<p; i+=d)
90*1123Sbill 		for(k=0;k<n;k++)
91*1123Sbill 			write(openf[k], out+i, d<p-i?d:p-i);
92*1123Sbill }
93*1123Sbill 
94*1123Sbill puts(s)
95*1123Sbill char *s;
96*1123Sbill {
97*1123Sbill 	while(*s)
98*1123Sbill 		write(2,s++,1);
99*1123Sbill }
100