diff options
Diffstat (limited to 'src/commands/tee.c')
-rw-r--r-- | src/commands/tee.c | 81 |
1 files changed, 0 insertions, 81 deletions
diff --git a/src/commands/tee.c b/src/commands/tee.c deleted file mode 100644 index b9b31be..0000000 --- a/src/commands/tee.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "../command.h" - -#include <signal.h> - -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) { - 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) { - - 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 = malloc(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; -} |