#include "../command.h" #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 Append to the given FILEs, don't overwrite\n"); printf("\t-i Ignore interrupt signals (SIGINT)\n"); exit(EXIT_SUCCESS); } static void handle(int dummy){UNUSED(dummy);} static void run_tee(int file_count, FILE* files[file_count]) { char c; while((c = getchar()) != EOF) { for (int i = 0; i < file_count; i++) { fwrite(&c, 1, 1, files[i]); fflush(files[i]); } putchar(c); } for (int 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: error("error: unkown option: %c", c); } return ARG_UNUSED; } COMMAND(tee) { flags.append = false; flags.handle_sigint = false; int 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; } FILE* files[argc - start]; for (int 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; }