|
|
1.1 root 1: /*
2: * tee.c
3: * 2/12/92
4: * Pipe redirection.
5: * Usage: tee [ -a ] [ -i ] [ file ] ...
6: * Rec'd from Lauren Weinstein, 7-16-84.
7: * Hacked by rec to use stdio so that everything doesn't come out buffered.
8: * Slightly rewritten by steve 4/30/91 for clarity; added "isatty" check.
9: */
10:
11: #include <stdio.h>
12: #include <errno.h>
13: #include <signal.h>
14:
15: #define NUFILE _NFILE /* max # open files */
16: #define USAGE "Usage: tee [ -a ] [ -i ] [ file ] ...\n"
17:
18: /* External. */
19: extern int exit();
20:
21: /* Forward. */
22: FILE *openf();
23: void fatal();
24:
25: /* Global. */
26: int aflag;
27:
28: main(argc, argv) int argc; register char *argv[];
29: {
30: register int c;
31: register FILE **fpp;
32: FILE *fp[NUFILE];
33:
34: if (signal(SIGINT, SIG_IGN) != SIG_IGN)
35: signal(SIGINT, exit);
36:
37: /* Process option arguments. */
38: while (*++argv && argv[0][0]=='-') {
39: switch (argv[0][1]) {
40: case 'a':
41: ++aflag;
42: break;
43: case 'i':
44: signal(SIGINT, SIG_IGN);
45: break;
46: default:
47: fprintf(stderr, USAGE);
48: exit(1);
49: }
50: }
51:
52: /* Open file arguments. */
53: for (fpp = fp; *argv; ) {
54: if (fpp >= &fp[NUFILE])
55: fatal("too many files");
56: *fpp++ = openf(*argv++);
57: }
58: *fpp = NULL;
59:
60: /* Make i/o unbuffered if interactive. */
61: if (isatty(fileno(stdin)))
62: setbuf(stdout, NULL);
63: if (isatty(fileno(stdout)))
64: setbuf(stdin, NULL);
65:
66: /* Copy stdin to stdout, duplicate to each specified file. */
67: while ((c = getchar()) != EOF) {
68: putchar(c);
69: for (fpp = fp; *fpp != NULL; fpp++) {
70: if (aflag)
71: fseek(*fpp, 0L, SEEK_END);
72: putc(c, *fpp);
73: }
74: }
75:
76: /* Done. */
77: exit(0);
78: }
79:
80: /*
81: * Cry and die.
82: */
83: /* VARARGS */
84: void
85: fatal(s) char *s;
86: { fprintf(stderr, "tee: %r\n", &s);
87: exit(1);
88: }
89:
90: /*
91: * Open a file.
92: */
93: FILE *
94: openf(file) char *file;
95: {
96: register FILE *fp;
97:
98: if ((fp = fopen(file, (aflag) ? "a" : "w")) != NULL) {
99: if (aflag) {
100: setbuf(fp, NULL);
101: fseek(fp, 0L, SEEK_END);
102: }
103: return fp;
104: }
105: switch (errno) {
106: case EMFILE:
107: case ENFILE:
108: fatal("too many files");
109: break;
110: default:
111: fatal("cannot create %s", file);
112: }
113: }
114:
115: /* end of tee.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.