date and time created 80/10/01 17:28:53 by bill
authorBill Joy <bill@ucbvax.Berkeley.EDU>
Thu, 2 Oct 1980 09:28:53 +0000 (01:28 -0800)
committerBill Joy <bill@ucbvax.Berkeley.EDU>
Thu, 2 Oct 1980 09:28:53 +0000 (01:28 -0800)
SCCS-vsn: usr.bin/tee/tee.c 4.1

usr/src/usr.bin/tee/tee.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/tee/tee.c b/usr/src/usr.bin/tee/tee.c
new file mode 100644 (file)
index 0000000..43c9438
--- /dev/null
@@ -0,0 +1,99 @@
+static char *sccsid = "@(#)tee.c       4.1 (Berkeley) %G%";
+/*
+ * tee-- pipe fitting
+ */
+
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <pagsiz.h>
+
+#define        BUFSIZ  BSIZE
+int openf[20] = { 1 };
+int n = 1;
+int t = 0;
+int aflag;
+
+char in[BUFSIZ];
+
+char out[BUFSIZ];
+
+extern errno;
+long   lseek();
+
+main(argc,argv)
+char **argv;
+{
+       int register r,w,p;
+       struct stat buf;
+       while(argc>1&&argv[1][0]=='-') {
+               switch(argv[1][1]) {
+               case 'a':
+                       aflag++;
+                       break;
+               case 'i':
+               case 0:
+                       signal(SIGINT, SIG_IGN);
+               }
+               argv++;
+               argc--;
+       }
+       fstat(1,&buf);
+       t = (buf.st_mode&S_IFMT)==S_IFCHR;
+       if(lseek(1,0L,1)==-1&&errno==ESPIPE)
+               t++;
+       while(argc-->1) {
+               if(aflag) {
+                       openf[n] = open(argv[1],1);
+                       if(openf[n] < 0)
+                               openf[n] = creat(argv[1],0666);
+                       lseek(openf[n++],0L,2);
+               } else
+                       openf[n++] = creat(argv[1],0666);
+               if(stat(argv[1],&buf)>=0) {
+                       if((buf.st_mode&S_IFMT)==S_IFCHR)
+                               t++;
+               } else {
+                       puts("tee: cannot open ");
+                       puts(argv[1]);
+                       puts("\n");
+                       n--;
+               }
+               argv++;
+       }
+       r = w = 0;
+       for(;;) {
+               for(p=0;p<BUFSIZ;) {
+                       if(r>=w) {
+                               if(t>0&&p>0) break;
+                               w = read(0,in,BUFSIZ);
+                               r = 0;
+                               if(w<=0) {
+                                       stash(p);
+                                       return;
+                               }
+                       }
+                       out[p++] = in[r++];
+               }
+               stash(p);
+       }
+}
+
+stash(p)
+{
+       int k;
+       int i;
+       int d;
+       d = t ? 16 : p;
+       for(i=0; i<p; i+=d)
+               for(k=0;k<n;k++)
+                       write(openf[k], out+i, d<p-i?d:p-i);
+}
+
+puts(s)
+char *s;
+{
+       while(*s)
+               write(2,s++,1);
+}