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