83 lines
1.7 KiB
C
83 lines
1.7 KiB
C
#include "command.h"
|
|
#include "lslib.h"
|
|
|
|
#include <signal.h>
|
|
#include <stdlib.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\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_main) {
|
|
|
|
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;
|
|
}
|