added "more" command
[unix-history] / usr / src / usr.bin / tee / tee.c
CommitLineData
7ea0db89 1#ifndef lint
04a3b12a 2static char *sccsid = "@(#)tee.c 4.4 (Berkeley) %G%";
7ea0db89 3#endif
381222b6
BJ
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>
381222b6 12
cb7bf434 13#define BUFSIZ 1024
381222b6
BJ
14int openf[20] = { 1 };
15int n = 1;
16int t = 0;
17int aflag;
18
19char in[BUFSIZ];
20
21char out[BUFSIZ];
22
23extern errno;
24long lseek();
25
26main(argc,argv)
27char **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);
02f3eb0c 75 exit(0);
381222b6
BJ
76 }
77 }
78 out[p++] = in[r++];
79 }
80 stash(p);
81 }
82}
83
84stash(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
95puts(s)
96char *s;
97{
98 while(*s)
99 write(2,s++,1);
100}