+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);
+}