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