|
|
1.1 ! root 1: static char *sccsid = "@(#)tee.c 4.1 (Berkeley) 10/1/80"; ! 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 ! 13: int openf[20] = { 1 }; ! 14: int n = 1; ! 15: int t = 0; ! 16: int aflag; ! 17: ! 18: char in[BUFSIZ]; ! 19: ! 20: char out[BUFSIZ]; ! 21: ! 22: extern errno; ! 23: long lseek(); ! 24: ! 25: main(argc,argv) ! 26: char **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: ! 83: stash(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: ! 94: puts(s) ! 95: char *s; ! 96: { ! 97: while(*s) ! 98: write(2,s++,1); ! 99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.