summaryrefslogtreecommitdiff
path: root/usr/src/lib/libcmd/common/tee.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libcmd/common/tee.c')
-rw-r--r--usr/src/lib/libcmd/common/tee.c202
1 files changed, 0 insertions, 202 deletions
diff --git a/usr/src/lib/libcmd/common/tee.c b/usr/src/lib/libcmd/common/tee.c
deleted file mode 100644
index 89eb57457f..0000000000
--- a/usr/src/lib/libcmd/common/tee.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/***********************************************************************
-* *
-* This software is part of the ast package *
-* Copyright (c) 1992-2010 AT&T Intellectual Property *
-* and is licensed under the *
-* Common Public License, Version 1.0 *
-* by AT&T Intellectual Property *
-* *
-* A copy of the License is available at *
-* http://www.opensource.org/licenses/cpl1.0.txt *
-* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
-* *
-* Information and Software Systems Research *
-* AT&T Research *
-* Florham Park NJ *
-* *
-* Glenn Fowler <gsf@research.att.com> *
-* David Korn <dgk@research.att.com> *
-* *
-***********************************************************************/
-#pragma prototyped
-/*
- * David Korn
- * AT&T Bell Laboratories
- *
- * tee
- */
-
-static const char usage[] =
-"[-?\n@(#)$Id: tee (AT&T Research) 2009-06-19 $\n]"
-USAGE_LICENSE
-"[+NAME?tee - duplicate standard input]"
-"[+DESCRIPTION?\btee\b copies standard input to standard output "
- "and to zero or more files. The options determine whether "
- "the specified files are overwritten or appended to. The "
- "\btee\b utility does not buffer output. If writes to any "
- "\afile\a fail, writes to other files continue although \btee\b "
- "will exit with a non-zero exit status.]"
-"[+?The number of \afile\a operands that can be specified is limited "
- "by the underlying operating system.]"
-"[a:append?Append the standard input to the given files rather "
- "than overwriting them.]"
-"[i:ignore-interrupts?Ignore SIGINT signal.]"
-"[l:linebuffer?Set the standard output to be line buffered.]"
-"\n"
-"\n[file ...]\n"
-"\n"
-"[+EXIT STATUS?]{"
- "[+0?All files copies successfully.]"
- "[+>0?An error occurred.]"
-"}"
-"[+SEE ALSO?\bcat\b(1), \bsignal\b(3)]"
-;
-
-#include <cmd.h>
-#include <ls.h>
-#include <sig.h>
-
-typedef struct Tee_s
-{
- Sfdisc_t disc;
- int line;
- int fd[1];
-} Tee_t;
-
-/*
- * This discipline writes to each file in the list given in handle
- */
-
-static ssize_t
-tee_write(Sfio_t* fp, const void* buf, size_t n, Sfdisc_t* handle)
-{
- register const char* bp;
- register const char* ep;
- register int* hp = ((Tee_t*)handle)->fd;
- register int fd = sffileno(fp);
- register ssize_t r;
-
- do
- {
- bp = (const char*)buf;
- ep = bp + n;
- while (bp < ep)
- {
- if ((r = write(fd, bp, ep - bp)) <= 0)
- return -1;
- bp += r;
- }
- } while ((fd = *hp++) >= 0);
- return n;
-}
-
-static void
-tee_cleanup(register Tee_t* tp)
-{
- register int* hp;
- register int n;
-
- if (tp)
- {
- sfdisc(sfstdout, NiL);
- if (tp->line >= 0)
- sfset(sfstdout, SF_LINE, tp->line);
- for (hp = tp->fd; (n = *hp) >= 0; hp++)
- close(n);
- }
-}
-
-int
-b_tee(int argc, register char** argv, void* context)
-{
- register Tee_t* tp = 0;
- register int oflag = O_WRONLY|O_TRUNC|O_CREAT|O_BINARY;
- register int* hp;
- register char* cp;
- int line;
-
- if (argc <= 0)
- {
- if (context && (tp = (Tee_t*)sh_context(context)->data))
- {
- sh_context(context)->data = 0;
- tee_cleanup(tp);
- }
- return 0;
- }
- cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_CALLBACK);
- line = -1;
- for (;;)
- {
- switch (optget(argv, usage))
- {
- case 'a':
- oflag &= ~O_TRUNC;
- oflag |= O_APPEND;
- continue;
- case 'i':
- signal(SIGINT, SIG_IGN);
- continue;
- case 'l':
- line = sfset(sfstdout, 0, 0) & SF_LINE;
- if ((line == 0) == (opt_info.num == 0))
- line = -1;
- else
- sfset(sfstdout, SF_LINE, !!opt_info.num);
- continue;
- case ':':
- error(2, "%s", opt_info.arg);
- break;
- case '?':
- error(ERROR_usage(2), "%s", opt_info.arg);
- break;
- }
- break;
- }
- if (error_info.errors)
- error(ERROR_usage(2), "%s", optusage(NiL));
- argv += opt_info.index;
- argc -= opt_info.index;
-#if _ANCIENT_BSD_COMPATIBILITY
- if (*argv && streq(*argv, "-"))
- {
- signal(SIGINT, SIG_IGN);
- argv++;
- argc--;
- }
-#endif
- if (argc > 0)
- {
- if (tp = (Tee_t*)stakalloc(sizeof(Tee_t) + argc * sizeof(int)))
- {
- memset(&tp->disc, 0, sizeof(tp->disc));
- tp->disc.writef = tee_write;
- if (context)
- sh_context(context)->data = (void*)tp;
- tp->line = line;
- hp = tp->fd;
- while (cp = *argv++)
- {
- if ((*hp = open(cp, oflag, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0)
- error(ERROR_system(0), "%s: cannot create", cp);
- else
- hp++;
- }
- if (hp == tp->fd)
- tp = 0;
- else
- {
- *hp = -1;
- sfdisc(sfstdout, &tp->disc);
- }
- }
- else
- error(ERROR_exit(0), "out of space");
- }
- if ((sfmove(sfstdin, sfstdout, SF_UNBOUND, -1) < 0 || !sfeof(sfstdin)) && errno != EPIPE)
- error(ERROR_system(0), "read error");
- if (sfsync(sfstdout))
- error(ERROR_system(0), "write error");
- tee_cleanup(tp);
- return error_info.errors;
-}