diff options
author | Ferass El Hafidi <vitali64pmemail@protonmail.com> | 2023-03-04 12:49:25 +0100 |
---|---|---|
committer | Ferass El Hafidi <vitali64pmemail@protonmail.com> | 2023-03-04 12:49:25 +0100 |
commit | 487860806eac38e8fefb40b29f6fbe706e0b677e (patch) | |
tree | 0a80c9fba5ec43b2c298100da4a88d4bdf11051a | |
parent | 46f6f0e65f5ec7d3f49352c300fe97e5510eda1d (diff) | |
download | fases-487860806eac38e8fefb40b29f6fbe706e0b677e.tar.gz fases-487860806eac38e8fefb40b29f6fbe706e0b677e.zip |
core/head: Properly handle standard input
Signed-off-by: Ferass El Hafidi <vitali64pmemail@protonmail.com>
-rw-r--r-- | core/head.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/core/head.c b/core/head.c index 76bb9d9..1a49819 100644 --- a/core/head.c +++ b/core/head.c @@ -13,7 +13,7 @@ #include "../common/common.h" int main(int argc, char *const argv[]) { - int argument, i, lines, lines_printed; + int argument, i, lines = 10, lines_printed; FILE *file; char s[4096], *argv0 = strdup(argv[0]); @@ -29,23 +29,20 @@ int main(int argc, char *const argv[]) { else lines = 10; } argc -= optind; argv += optind; - if (argc < 1) { - while (read(STDIN_FILENO, s, 4096) > 0) - printf("%s", s); - } - if (!lines) lines = 10; - for (i = 0; i != argc; i++) { - if (strcmp(argv[i], "-")) file = fopen(argv[i], "r"); - else while (read(STDIN_FILENO, s, 4096) > 0) printf("%s", s); + + for (i = 0; i != argc || argc == 0; i++) { + if (argc == 0 || !strcmp(argv[i], "-")) + file = stdin; + else file = fopen(argv[i], "r"); if (file == NULL) return errprint(argv0, argv[i], errno); /* Something went wrong */ for (lines_printed = 1; lines_printed <= lines; lines_printed++) { if (fgets(s, 4096, file) != NULL) printf("%s", s); - else if (errno) - return errprint(argv0, "fgets()", errno); + else return errprint(argv0, "fgets()", errno); } - fclose(file); + if (file != stdin) fclose(file); + if (argc == 0) return 0; /* TODO: Remove this stupid hack. */ } return 0; } |