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