cat,nl: fix handling of open errors
No binary (build failed)
—
(log yok)
| @@ -195,6 +195,7 @@ int cat_main(int argc UNUSED_PARAM, char **argv) | |
| # define CAT_OPT_b (1<<1) | |
| if (opts & (CAT_OPT_n|CAT_OPT_b)) { /* -n or -b */ | |
| struct number_state ns; | |
| + | int exitcode; |
| ns.width = 6; | |
| ns.start = 1; | |
| @@ -203,10 +204,11 @@ int cat_main(int argc UNUSED_PARAM, char **argv) | |
| ns.empty_str = "\n"; | |
| ns.all = !(opts & CAT_OPT_b); /* -n without -b */ | |
| ns.nonempty = (opts & CAT_OPT_b); /* -b (with or without -n) */ | |
| + | exitcode = EXIT_SUCCESS; |
| do { | |
| - | print_numbered_lines(&ns, *argv); |
| + | exitcode |= print_numbered_lines(&ns, *argv); |
| } while (*++argv); | |
| - | fflush_stdout_and_exit(EXIT_SUCCESS); |
| + | fflush_stdout_and_exit(exitcode); |
| } | |
| /*opts >>= 2;*/ | |
| #endif | |
| @@ -58,6 +58,8 @@ int nl_main(int argc UNUSED_PARAM, char **argv) | |
| "number-width\0" Required_argument "w" | |
| ; | |
| #endif | |
| + | int exitcode; |
| + | |
| ns.width = 6; | |
| ns.start = 1; | |
| ns.inc = 1; | |
| @@ -72,9 +74,10 @@ int nl_main(int argc UNUSED_PARAM, char **argv) | |
| if (!*argv) | |
| *--argv = (char*)"-"; | |
| + | exitcode = EXIT_SUCCESS; |
| do { | |
| - | print_numbered_lines(&ns, *argv); |
| + | exitcode |= print_numbered_lines(&ns, *argv); |
| } while (*++argv); | |
| - | fflush_stdout_and_exit(EXIT_SUCCESS); |
| + | fflush_stdout_and_exit(exitcode); |
| } | |
| @@ -1386,7 +1386,7 @@ struct number_state { | |
| const char *empty_str; | |
| smallint all, nonempty; | |
| }; | |
| - | void print_numbered_lines(struct number_state *ns, const char *filename) FAST_FUNC; |
| + | int print_numbered_lines(struct number_state *ns, const char *filename) FAST_FUNC; |
| /* Networking */ | |
| @@ -8,12 +8,16 @@ | |
| #include "libbb.h" | |
| - | void FAST_FUNC print_numbered_lines(struct number_state *ns, const char *filename) |
| + | int FAST_FUNC print_numbered_lines(struct number_state *ns, const char *filename) |
| { | |
| FILE *fp = fopen_or_warn_stdin(filename); | |
| - | unsigned N = ns->start; |
| + | unsigned N; |
| char *line; | |
| + | if (!fp) |
| + | return EXIT_FAILURE; |
| + | |
| + | N = ns->start; |
| while ((line = xmalloc_fgetline(fp)) != NULL) { | |
| if (ns->all | |
| || (ns->nonempty && line[0]) | |
| @@ -27,4 +31,6 @@ void FAST_FUNC print_numbered_lines(struct number_state *ns, const char *filenam | |
| ns->start = N; | |
| fclose(fp); | |
| + | |
| + | return EXIT_SUCCESS; |
| } | |