From c0321f9bc67e0a90dbd12f4d7b39d6991c9899cd Mon Sep 17 00:00:00 2001 From: Matt Kraai Date: Wed, 27 Sep 2000 04:09:22 +0000 Subject: Rewrote head to perservere when it can't open a file, and share code with cat. --- busybox.h | 1 + coreutils/head.c | 93 +++++++++++++++++++++++++------------------------------ head.c | 93 +++++++++++++++++++++++++------------------------------ include/busybox.h | 1 + utility.c | 20 ++++++++++-- 5 files changed, 105 insertions(+), 103 deletions(-) diff --git a/busybox.h b/busybox.h index faad206ee..da17b8ab3 100644 --- a/busybox.h +++ b/busybox.h @@ -395,6 +395,7 @@ extern int print_file_by_name(char *filename); extern char process_escape_sequence(char **ptr); extern char *get_last_path_component(char *path); extern void xregcomp(regex_t *preg, const char *regex, int cflags); +extern FILE *wfopen(const char *path, const char *mode); extern FILE *xfopen(const char *path, const char *mode); #ifndef DMALLOC diff --git a/coreutils/head.c b/coreutils/head.c index c232e1153..92b43bae2 100644 --- a/coreutils/head.c +++ b/coreutils/head.c @@ -26,17 +26,16 @@ #include #include -int head(int len, FILE * src) +int head(int len, FILE *fp) { int i; - char buffer[1024]; + char *input; for (i = 0; i < len; i++) { - fgets(buffer, 1024, src); - if (feof(src)) { + if ((input = get_line_from_file(fp)) == NULL) break; - } - fputs(buffer, stdout); + fputs(input, stdout); + free(input); } return 0; } @@ -44,60 +43,54 @@ int head(int len, FILE * src) /* BusyBoxed head(1) */ int head_main(int argc, char **argv) { - char opt; - int len = 10, tmplen, i; + FILE *fp; + int need_headers, opt, len = 10, status = EXIT_SUCCESS; /* parse argv[] */ - for (i = 1; i < argc; i++) { - if (argv[i][0] == '-') { - opt = argv[i][1]; - switch (opt) { - case 'n': - tmplen = 0; - if (++i < argc) - tmplen = atoi(argv[i]); - if (tmplen < 1) - usage(head_usage); - len = tmplen; + while ((opt = getopt(argc, argv, "n:")) > 0) { + switch (opt) { + case 'n': + len = atoi(optarg); + if (len >= 1) break; - case '-': - case 'h': - usage(head_usage); - default: - errorMsg("invalid option -- %c\n", opt); - usage(head_usage); - } - } else { - break; + /* fallthrough */ + default: + usage(head_usage); } } /* get rest of argv[] or stdin if nothing's left */ - if (i >= argc) { + if (argv[optind] == NULL) { head(len, stdin); + return status; + } - } else { - int need_headers = ((argc - i) > 1); - - for (; i < argc; i++) { - FILE *src; - - src = fopen(argv[i], "r"); - if (!src) { - errorMsg("%s: %s\n", argv[i], strerror(errno)); - } else { - /* emulating GNU behaviour */ - if (need_headers) { - fprintf(stdout, "==> %s <==\n", argv[i]); - } - head(len, src); - if (i < argc - 1) { - fprintf(stdout, "\n"); - } + need_headers = optind != (argc - 1); + while (argv[optind]) { + if (strcmp(argv[optind], "-") == 0) { + fp = stdin; + argv[optind] = "standard input"; + } else { + if ((fp = wfopen(argv[optind], "r")) == NULL) + status = EXIT_FAILURE; + } + if (fp) { + if (need_headers) { + fprintf(stdout, "==> %s <==\n", argv[optind]); + } + head(len, fp); + if (errno) { + errorMsg("%s: %s\n", argv[optind], strerror(errno)); + status = EXIT_FAILURE; + errno = 0; } + if (optind < argc - 1) + fprintf(stdout, "\n"); + if (fp != stdin) + fclose(fp); } + optind++; } - return(0); -} -/* $Id: head.c,v 1.14 2000/09/25 21:45:57 andersen Exp $ */ + return status; +} diff --git a/head.c b/head.c index c232e1153..92b43bae2 100644 --- a/head.c +++ b/head.c @@ -26,17 +26,16 @@ #include #include -int head(int len, FILE * src) +int head(int len, FILE *fp) { int i; - char buffer[1024]; + char *input; for (i = 0; i < len; i++) { - fgets(buffer, 1024, src); - if (feof(src)) { + if ((input = get_line_from_file(fp)) == NULL) break; - } - fputs(buffer, stdout); + fputs(input, stdout); + free(input); } return 0; } @@ -44,60 +43,54 @@ int head(int len, FILE * src) /* BusyBoxed head(1) */ int head_main(int argc, char **argv) { - char opt; - int len = 10, tmplen, i; + FILE *fp; + int need_headers, opt, len = 10, status = EXIT_SUCCESS; /* parse argv[] */ - for (i = 1; i < argc; i++) { - if (argv[i][0] == '-') { - opt = argv[i][1]; - switch (opt) { - case 'n': - tmplen = 0; - if (++i < argc) - tmplen = atoi(argv[i]); - if (tmplen < 1) - usage(head_usage); - len = tmplen; + while ((opt = getopt(argc, argv, "n:")) > 0) { + switch (opt) { + case 'n': + len = atoi(optarg); + if (len >= 1) break; - case '-': - case 'h': - usage(head_usage); - default: - errorMsg("invalid option -- %c\n", opt); - usage(head_usage); - } - } else { - break; + /* fallthrough */ + default: + usage(head_usage); } } /* get rest of argv[] or stdin if nothing's left */ - if (i >= argc) { + if (argv[optind] == NULL) { head(len, stdin); + return status; + } - } else { - int need_headers = ((argc - i) > 1); - - for (; i < argc; i++) { - FILE *src; - - src = fopen(argv[i], "r"); - if (!src) { - errorMsg("%s: %s\n", argv[i], strerror(errno)); - } else { - /* emulating GNU behaviour */ - if (need_headers) { - fprintf(stdout, "==> %s <==\n", argv[i]); - } - head(len, src); - if (i < argc - 1) { - fprintf(stdout, "\n"); - } + need_headers = optind != (argc - 1); + while (argv[optind]) { + if (strcmp(argv[optind], "-") == 0) { + fp = stdin; + argv[optind] = "standard input"; + } else { + if ((fp = wfopen(argv[optind], "r")) == NULL) + status = EXIT_FAILURE; + } + if (fp) { + if (need_headers) { + fprintf(stdout, "==> %s <==\n", argv[optind]); + } + head(len, fp); + if (errno) { + errorMsg("%s: %s\n", argv[optind], strerror(errno)); + status = EXIT_FAILURE; + errno = 0; } + if (optind < argc - 1) + fprintf(stdout, "\n"); + if (fp != stdin) + fclose(fp); } + optind++; } - return(0); -} -/* $Id: head.c,v 1.14 2000/09/25 21:45:57 andersen Exp $ */ + return status; +} diff --git a/include/busybox.h b/include/busybox.h index faad206ee..da17b8ab3 100644 --- a/include/busybox.h +++ b/include/busybox.h @@ -395,6 +395,7 @@ extern int print_file_by_name(char *filename); extern char process_escape_sequence(char **ptr); extern char *get_last_path_component(char *path); extern void xregcomp(regex_t *preg, const char *regex, int cflags); +extern FILE *wfopen(const char *path, const char *mode); extern FILE *xfopen(const char *path, const char *mode); #ifndef DMALLOC diff --git a/utility.c b/utility.c index df2515c2b..03d649757 100644 --- a/utility.c +++ b/utility.c @@ -1634,12 +1634,14 @@ extern void print_file(FILE *file) extern int print_file_by_name(char *filename) { FILE *file; - file = fopen(filename, "r"); - if (file == NULL) { + if ((file = wfopen(filename, "r")) == NULL) + return FALSE; + print_file(file); + if (errno) { errorMsg("%s: %s\n", filename, strerror(errno)); + errno = 0; return FALSE; } - print_file(file); return TRUE; } #endif /* BB_CAT */ @@ -1719,6 +1721,18 @@ void xregcomp(regex_t *preg, const char *regex, int cflags) } #endif +#if defined BB_CAT || defined BB_HEAD +FILE *wfopen(const char *path, const char *mode) +{ + FILE *fp; + if ((fp = fopen(path, mode)) == NULL) { + errorMsg("%s: %s\n", path, strerror(errno)); + errno = 0; + } + return fp; +} +#endif + #if defined BB_HOSTNAME || defined BB_LOADACM || defined BB_MORE || defined BB_SED || defined BB_SH || defined BB_UNIQ || defined BB_WC FILE *xfopen(const char *path, const char *mode) { -- cgit v1.2.3