int cat_main(int argc, char **argv) { FILE *f; int retval = EXIT_SUCCESS; bb_getopt_ulflags(argc, argv, "u"); argv += optind; if (!*argv) { *--argv = "-"; } do { if ((f = bb_wfopen_input(*argv)) != NULL) { int r = bb_copyfd_eof(fileno(f), STDOUT_FILENO); bb_fclose_nonstdin(f); if (r >= 0) { continue; } } retval = EXIT_FAILURE; } while (*++argv); return retval; }
int sort_main(int argc, char **argv) { FILE *fp; char *line, **lines = NULL; int i, nlines = 0, inc; int (*compare)(const void *, const void *) = compare_ascii; int flags; bb_default_error_retval = 2; flags = bb_getopt_ulflags(argc, argv, "nru"); if (flags & 1) { compare = compare_numeric; } argv += optind; if (!*argv) { *--argv = "-"; } do { fp = xgetoptfile_sort_uniq(argv, "r"); while ((line = bb_get_chomped_line_from_file(fp)) != NULL) { lines = xrealloc(lines, sizeof(char *) * (nlines + 1)); lines[nlines++] = line; } bb_xferror(fp, *argv); bb_fclose_nonstdin(fp); } while (*++argv); /* sort it */ qsort(lines, nlines, sizeof(char *), compare); /* print it */ i = 0; --nlines; if ((inc = 1 - (flags & 2)) < 0) { /* reverse */ i = nlines; } flags &= 4; while (nlines >= 0) { if (!flags || !nlines || strcmp(lines[i+inc], lines[i])) { puts(lines[i]); } i += inc; --nlines; } bb_fflush_stdout_and_exit(EXIT_SUCCESS); }
extern int fold_main(int argc, char **argv) { /* If nonzero, try to break on whitespace. */ int break_spaces; /* If nonzero, at least one of the files we read was standard input. */ int have_read_stdin; int width = 80; int i; int optc; int errs = 0; break_spaces = count_bytes = have_read_stdin = 0; /* Turn any numeric options into -w options. */ for (i = 1; i < argc; i++) { char const *a = argv[i]; if (a[0] == '-') { if (a[1] == '-' && !a[2]) break; if (isdigit(a[1])) { char *s = xmalloc(strlen(a) + 2); s[0] = '-'; s[1] = 'w'; strcpy(s + 2, a + 1); argv[i] = s; } } } while ((optc = getopt(argc, argv, "bsw:")) > 0) { switch (optc) { case 'b': /* Count bytes rather than columns. */ count_bytes = 1; break; case 's': /* Break at word boundaries. */ break_spaces = 1; break; case 'w': { /* Line width. */ width = bb_xgetlarg(optarg, 10, 1, 10000); break; } default: bb_show_usage(); } } argv += optind; if (!*argv) { *--argv = "-"; } do { FILE *istream = bb_wfopen_input(*argv); if (istream != NULL) { int c; int column = 0; /* Screen column where next char will go. */ int offset_out = 0; /* Index in `line_out' for next char. */ static char *line_out = NULL; static int allocated_out = 0; while ((c = getc(istream)) != EOF) { if (offset_out + 1 >= allocated_out) { allocated_out += 1024; line_out = xrealloc(line_out, allocated_out); } if (c == '\n') { line_out[offset_out++] = c; fwrite(line_out, sizeof(char), (size_t) offset_out, stdout); column = offset_out = 0; continue; } rescan: column = adjust_column(column, c); if (column > width) { /* This character would make the line too long. Print the line plus a newline, and make this character start the next line. */ if (break_spaces) { /* Look for the last blank. */ int logical_end; for (logical_end = offset_out - 1; logical_end >= 0; logical_end--) { if (isblank(line_out[logical_end])) { break; } } if (logical_end >= 0) { /* Found a blank. Don't output the part after it. */ logical_end++; fwrite(line_out, sizeof(char), (size_t) logical_end, stdout); putchar('\n'); /* Move the remainder to the beginning of the next line. The areas being copied here might overlap. */ memmove(line_out, line_out + logical_end, offset_out - logical_end); offset_out -= logical_end; for (column = i = 0; i < offset_out; i++) { column = adjust_column(column, line_out[i]); } goto rescan; } } else { if (offset_out == 0) { line_out[offset_out++] = c; continue; } } line_out[offset_out++] = '\n'; fwrite(line_out, sizeof(char), (size_t) offset_out, stdout); column = offset_out = 0; goto rescan; } line_out[offset_out++] = c; } if (offset_out) { fwrite(line_out, sizeof(char), (size_t) offset_out, stdout); } if (ferror(istream) || bb_fclose_nonstdin(istream)) { bb_perror_msg("%s", *argv); /* Avoid multibyte problems. */ errs |= EXIT_FAILURE; } } else { errs |= EXIT_FAILURE; } } while (*++argv); bb_fflush_stdout_and_exit(errs); }
int head_main(int argc, char **argv) { unsigned long count = 10; unsigned long i; #ifdef CONFIG_FEATURE_FANCY_HEAD int count_bytes = 0; int header_threshhold = 1; #endif FILE *fp; const char *fmt; char *p; int opt; int c; int retval = EXIT_SUCCESS; /* Allow legacy syntax of an initial numeric option without -n. */ if ((argc > 1) && (argv[1][0] == '-') /* && (isdigit)(argv[1][1]) */ && (((unsigned int)(argv[1][1] - '0')) <= 9) ) { --argc; ++argv; p = (*argv) + 1; goto GET_COUNT; } while ((opt = getopt(argc, argv, head_opts)) > 0) { switch(opt) { #ifdef CONFIG_FEATURE_FANCY_HEAD case 'q': header_threshhold = INT_MAX; break; case 'v': header_threshhold = -1; break; case 'c': count_bytes = 1; /* fall through */ #endif case 'n': p = optarg; GET_COUNT: count = bb_xgetularg10(p); break; default: bb_show_usage(); } } argv += optind; if (!*argv) { *--argv = "-"; } fmt = header_fmt_str + 1; #ifdef CONFIG_FEATURE_FANCY_HEAD if (argc - optind <= header_threshhold) { header_threshhold = 0; } #else if (argc <= optind + 1) { fmt += 11; } /* Now define some things here to avoid #ifdefs in the code below. * These should optimize out of the if conditions below. */ #define header_threshhold 1 #define count_bytes 0 #endif do { if ((fp = bb_wfopen_input(*argv)) != NULL) { if (fp == stdin) { *argv = (char *) bb_msg_standard_input; } if (header_threshhold) { bb_printf(fmt, *argv); } i = count; while (i && ((c = getc(fp)) != EOF)) { if (count_bytes || (c == '\n')) { --i; } putchar(c); } if (bb_fclose_nonstdin(fp)) { bb_perror_msg("%s", *argv); /* Avoid multibyte problems. */ retval = EXIT_FAILURE; } bb_xferror_stdout(); } fmt = header_fmt_str; } while (*++argv); bb_fflush_stdout_and_exit(retval); }
extern int fold_main(int argc, char **argv) { char *w_opt; int width = 80; int i; int errs = 0; #ifdef CONFIG_FEATURE_SUSv2_OBSOLETE /* Turn any numeric options into -w options. */ for (i = 1; i < argc; i++) { char const *a = argv[i]; if (a[0] == '-') { if (a[1] == '-' && !a[2]) break; if (isdigit(a[1])) { char *s = xmalloc(strlen(a) + 2); s[0] = '-'; s[1] = 'w'; strcpy(s + 2, a + 1); argv[i] = s; } } } #endif flags = bb_getopt_ulflags(argc, argv, "bsw:", &w_opt); if (flags & FLAG_WIDTH) width = bb_xgetlarg(w_opt, 10, 1, 10000); argv += optind; if (!*argv) { *--argv = "-"; } do { FILE *istream = bb_wfopen_input(*argv); if (istream != NULL) { int c; int column = 0; /* Screen column where next char will go. */ int offset_out = 0; /* Index in `line_out' for next char. */ static char *line_out = NULL; static int allocated_out = 0; while ((c = getc(istream)) != EOF) { if (offset_out + 1 >= allocated_out) { allocated_out += 1024; line_out = xrealloc(line_out, allocated_out); } if (c == '\n') { line_out[offset_out++] = c; fwrite(line_out, sizeof(char), (size_t) offset_out, stdout); column = offset_out = 0; continue; } rescan: column = adjust_column(column, c); if (column > width) { /* This character would make the line too long. Print the line plus a newline, and make this character start the next line. */ if (flags & FLAG_BREAK_SPACES) { /* Look for the last blank. */ int logical_end; for (logical_end = offset_out - 1; logical_end >= 0; logical_end--) { if (isblank(line_out[logical_end])) { break; } } if (logical_end >= 0) { /* Found a blank. Don't output the part after it. */ logical_end++; fwrite(line_out, sizeof(char), (size_t) logical_end, stdout); putchar('\n'); /* Move the remainder to the beginning of the next line. The areas being copied here might overlap. */ memmove(line_out, line_out + logical_end, offset_out - logical_end); offset_out -= logical_end; for (column = i = 0; i < offset_out; i++) { column = adjust_column(column, line_out[i]); } goto rescan; } } else { if (offset_out == 0) { line_out[offset_out++] = c; continue; } } line_out[offset_out++] = '\n'; fwrite(line_out, sizeof(char), (size_t) offset_out, stdout); column = offset_out = 0; goto rescan; } line_out[offset_out++] = c; } if (offset_out) { fwrite(line_out, sizeof(char), (size_t) offset_out, stdout); } if (ferror(istream) || bb_fclose_nonstdin(istream)) { bb_perror_msg("%s", *argv); /* Avoid multibyte problems. */ errs |= EXIT_FAILURE; } } else { errs |= EXIT_FAILURE; } } while (*++argv); bb_fflush_stdout_and_exit(errs); }
/* This could become a common function for md5 as well, by using md5_stream */ static int hash_files(int argc, char **argv, const uint8_t hash_algo) { int return_value = EXIT_SUCCESS; uint8_t *hash_value; #ifdef CONFIG_FEATURE_MD5_SHA1_SUM_CHECK unsigned int flags; flags = bb_getopt_ulflags(argc, argv, "scw"); #endif #ifdef CONFIG_FEATURE_MD5_SHA1_SUM_CHECK if (!(flags & FLAG_CHECK)) { if (flags & FLAG_SILENT) { bb_error_msg_and_die ("the -s option is meaningful only when verifying checksums"); } else if (flags & FLAG_WARN) { bb_error_msg_and_die ("the -w option is meaningful only when verifying checksums"); } } #endif if (argc == optind) { argv[argc++] = "-"; } #ifdef CONFIG_FEATURE_MD5_SHA1_SUM_CHECK if (flags & FLAG_CHECK) { FILE *pre_computed_stream; int count_total = 0; int count_failed = 0; char *file_ptr = argv[optind]; char *line; if (optind + 1 != argc) { bb_error_msg_and_die ("only one argument may be specified when using -c"); } if (strcmp(file_ptr, "-") == 0) { pre_computed_stream = stdin; } else { pre_computed_stream = bb_xfopen(file_ptr, "r"); } while ((line = bb_get_chomped_line_from_file(pre_computed_stream)) != NULL) { char *filename_ptr; count_total++; filename_ptr = strstr(line, " "); if (filename_ptr == NULL) { if (flags & FLAG_WARN) { bb_error_msg("Invalid format"); } count_failed++; return_value = EXIT_FAILURE; free(line); continue; } *filename_ptr = '\0'; filename_ptr += 2; hash_value = hash_file(filename_ptr, hash_algo); if (hash_value && (strcmp((char*)hash_value, line) == 0)) { if (!(flags & FLAG_SILENT)) printf("%s: OK\n", filename_ptr); } else { if (!(flags & FLAG_SILENT)) printf("%s: FAILED\n", filename_ptr); count_failed++; return_value = EXIT_FAILURE; } /* possible free(NULL) */ free(hash_value); free(line); } if (count_failed && !(flags & FLAG_SILENT)) { bb_error_msg("WARNING: %d of %d computed checksums did NOT match", count_failed, count_total); } if (bb_fclose_nonstdin(pre_computed_stream) == EOF) { bb_perror_msg_and_die("Couldnt close file %s", file_ptr); } } else #endif { while (optind < argc) { char *file_ptr = argv[optind++]; hash_value = hash_file(file_ptr, hash_algo); if (hash_value == NULL) { return_value = EXIT_FAILURE; } else { printf("%s %s\n", hash_value, file_ptr); free(hash_value); } } } return (return_value); }