#include "command.h" #include "lslib.h" #include #include static struct { bool append; bool handle_sigint; } flags; static void help(void) { printf("Usage: tee [-ai] [FILE]...\n\n"); printf("Copy stdin to each FILE, and also to stdout\n\n"); printf("\t-a\tAppend to the given FILEs, don't overwrite\n"); printf("\t-i\tIgnore interrupt signals (SIGINT)\n"); exit(EXIT_SUCCESS); } static void handle(int dummy){UNUSED(dummy);} static void run_tee(int file_count, FILE** files) { char c; int i; while((c = getchar()) != EOF) { int i; for (i = 0; i < file_count; i++) { fwrite(&c, 1, 1, files[i]); fflush(files[i]); } putchar(c); } for (i = 0; i < file_count; i++) { fclose(files[i]); } } static int short_arg(char c, char* next) { UNUSED(next); switch (c) { case 'a': flags.append = true; break; case 'i': flags.handle_sigint = true; break; default: return ARG_INVALID; } return ARG_UNUSED; } COMMAND(tee_cmd) { int start, i; FILE** files; flags.append = false; flags.handle_sigint = false; start = parse_args(argc, argv, help, short_arg, NULL); if (flags.handle_sigint) { signal(SIGINT, handle); } if (argc - start < 1) { run_tee(0, NULL); return EXIT_SUCCESS; } files = xalloc(sizeof(FILE*) * (argc - start)); for (i = start; i < argc; i++) { FILE* file = get_file(argv[i], flags.append ? "a" : "w"); files[i - start] = file; } run_tee(argc - start, files); return EXIT_SUCCESS; }