73 lines
1.7 KiB
C
73 lines
1.7 KiB
C
|
#include "../command.h"
|
||
|
|
||
|
#include <signal.h>
|
||
|
|
||
|
static void help() {
|
||
|
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(){}
|
||
|
|
||
|
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]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
COMMAND(tee) {
|
||
|
|
||
|
bool append = false;
|
||
|
bool handle_sigint = false;
|
||
|
|
||
|
int start = 0;
|
||
|
for (int i = 0; i < argc; i++) {
|
||
|
if (!prefix("-", argv[i])) break;
|
||
|
if (streql("--help", argv[i])) help();
|
||
|
|
||
|
start++;
|
||
|
for (size_t j = 1; j < strlen(argv[i]); j++) {
|
||
|
char o = argv[i][j];
|
||
|
switch (o) {
|
||
|
case 'a':
|
||
|
append = true;
|
||
|
break;
|
||
|
case 'i':
|
||
|
handle_sigint = true;
|
||
|
break;
|
||
|
default:
|
||
|
error("error: unkown option: %c", o);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (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], append ? "a" : "w");
|
||
|
files[i - start] = file;
|
||
|
}
|
||
|
|
||
|
run_tee(argc - start, files);
|
||
|
return EXIT_SUCCESS;
|
||
|
}
|