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