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