Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10 beta 3/9/83; site callan.UUCP Path: utzoo!linus!decvax!tektronix!hplabs!sdcrdcf!trwrb!scgvaxd!wlbr!callan!geoff From: geoff@callan.UUCP (Geoff Kuenning) Newsgroups: net.sources Subject: Version of tee(1) that uses fcopen(3) Message-ID: <222@callan.UUCP> Date: Fri, 24-Aug-84 19:38:31 EDT Article-I.D.: callan.222 Posted: Fri Aug 24 19:38:31 1984 Date-Received: Thu, 30-Aug-84 07:42:48 EDT Organization: Callan Data Systems, Westlake Village, CA Lines: 92 : This is a shar archive. Extract with sh, not csh. : The rest of this file will extract: : README tee.c echo extracting - README sed 's/^X//' > README << '/*EOF' X Oops. Nothing like saying you are posting something and then forgetting X to include it to make you feel stupid. Here's my promised public-domain X version of 'tee', which uses 'fcopen' instead of 'fopen'. X X Geoff Kuenning X Callan Data Systems X ...!ihnp4!wlbr!callan!geoff /*EOF echo extracting - tee.c sed 's/^X//' > tee.c << '/*EOF' Xstatic char Sccs_Id[] = "@(#)mytee.c 1.3 3/23/84 00:09:49"; X X#include X Xextern FILE * fcopen (); /* Open a file or a command */ X Xint main ( /* Tee, but using fcopen () */ X argc, /* Argument count */ X argv) /* Argument vector */ X register int argc; /* Argument count */ X register char * argv[]; /* Argument vector */ X { X register int ch; /* Character read from input stream */ X char buf[100]; /* Buffer for error message */ X FILE * files[_NFILE]; /* Array of output streams */ X register int curfile; /* Current file index */ X int nobufs = 0; /* Nonzero to suppress stdio buffers */ X register int numfiles; /* Total number of files open */ X char * opentype = "w"; /* Type of open to do */ X int status; /* Return status from program */ X X/* X Open all files X*/ X if (argc > 1 && *argv[1] == '-') X { X ++argv; X --argc; X while (*++(argv[0])) X if (**argv == 'a') X opentype = "a"; X else if (**argv == 'u') X nobufs = 1; X else X { X fprintf (stderr, "Usage: tee [-au] [files]\n"); X return 1; X } X } X for (numfiles = 0; --argc > 0 && numfiles < _NFILE; ) X { X files[numfiles] = fcopen (*++argv, opentype); X if (files[numfiles] == (FILE *) NULL) X { X sprintf (buf, "tee: Failed to open %s", *argv); X perror (buf); X status = 1; X } X else X { X if (nobufs || isatty (fileno (files[numfiles]))) X setbuf (files[numfiles], (char *) NULL); X numfiles++; X } X } X if (nobufs || isatty (fileno (stdout))) X setbuf (stdout, (char *) NULL); X/* X Copy input to all output files and standard output X*/ X while ((ch = getchar ()) != EOF) X { X for (curfile = 0; curfile < numfiles; curfile++) X putc (ch, files[curfile]); X putc (ch, stdout); X } X for (curfile = 0; curfile < numfiles; curfile++) X status |= fcclose (files[curfile]); X return status; X } /*EOF exit -- Geoff Kuenning Callan Data Systems ...!ihnp4!wlbr!callan!geoff