/* * Output command-line help to stdout. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #define N_(String) (String) struct optdesc_s { char *optshort; char *optlong; char *param; char *description; }; /* * Display command-line help. */ void display_help(void) { struct optdesc_s optlist[] = { {"-p", "--progress", 0, N_("show progress bar")}, {"-t", "--timer", 0, N_("show elapsed time")}, {"-e", "--eta", 0, N_("show estimated time of arrival (completion)")}, {"-I", "--fineta", 0, N_ ("show absolute estimated time of arrival (completion)")}, {"-r", "--rate", 0, N_("show data transfer rate counter")}, {"-a", "--average-rate", 0, N_("show data transfer average rate counter")}, {"-m", "--average-rate-window", N_("SEC"), N_ ("compute average rate over past SEC seconds (default 30s)")}, {"-b", "--bytes", 0, N_("show number of bytes transferred")}, {"-8", "--bits", 0, N_("show number of bits transferred")}, {"-T", "--buffer-percent", 0, N_("show percentage of transfer buffer in use")}, {"-A", "--last-written", _("NUM"), N_("show NUM bytes last written")}, {"-F", "--format", N_("FORMAT"), N_("set output format to FORMAT")}, {"-n", "--numeric", 0, N_("output percentages, not visual information")}, {"-q", "--quiet", 0, N_("do not output any transfer information at all")}, {"", 0, 0, 0}, {"-W", "--wait", 0, N_("display nothing until first byte transferred")}, {"-D", "--delay-start", N_("SEC"), N_("display nothing until SEC seconds have passed")}, {"-s", "--size", N_("SIZE"), N_("set estimated data size to SIZE bytes")}, {"-l", "--line-mode", 0, N_("count lines instead of bytes")}, {"-0", "--null", 0, N_("lines are null-terminated")}, {"-i", "--interval", N_("SEC"), N_("update every SEC seconds")}, {"-w", "--width", N_("WIDTH"), N_("assume terminal is WIDTH characters wide")}, {"-H", "--height", N_("HEIGHT"), N_("assume terminal is HEIGHT rows high")}, {"-N", "--name", N_("NAME"), N_("prefix visual information with NAME")}, {"-f", "--force", 0, N_("output even if standard error is not a terminal")}, {"-c", "--cursor", 0, N_("use cursor positioning escape sequences")}, {"", 0, 0, 0}, {"-L", "--rate-limit", N_("RATE"), N_("limit transfer to RATE bytes per second")}, {"-B", "--buffer-size", N_("BYTES"), N_("use a buffer size of BYTES")}, {"-C", "--no-splice", 0, N_("never use splice(), always use read/write")}, {"-E", "--skip-errors", 0, N_("skip read errors in input")}, {"-S", "--stop-at-size", 0, N_("stop after --size bytes have been transferred")}, #ifdef HAVE_IPC {"-R", "--remote", N_("PID"), N_("update settings of process PID")}, #endif /* HAVE_IPC */ {"", 0, 0, 0}, {"-P", "--pidfile", N_("FILE"), N_("save process ID in FILE")}, {"", 0, 0, 0}, {"-d", "--watchfd", N_("PID[:FD]"), N_("watch file FD opened by process PID")}, {"", 0, 0, 0}, {"-h", "--help", 0, N_("show this help and exit")}, {"-V", "--version", 0, N_("show version information and exit")}, {0, 0, 0, 0} }; unsigned int i, col1max = 0, tw = 77; char *optbuf; printf(_("Usage: %s [OPTION] [FILE]..."), PROGRAM_NAME); printf("\n%s\n\n", _ ("Concatenate FILE(s), or standard input, to standard output,\n" "with monitoring.")); for (i = 0; optlist[i].optshort; i++) { unsigned int width = 0; char *param; width = 2 + (unsigned int) strlen(optlist[i].optshort); #ifdef HAVE_GETOPT_LONG if (optlist[i].optlong) width += 2 + (unsigned int) strlen(optlist[i].optlong); #endif param = optlist[i].param; if (param) param = _(param); if (param) width += 1 + strlen(param); if (width > col1max) col1max = width; } col1max++; optbuf = malloc((size_t) (col1max + 16)); if (NULL == optbuf) { fprintf(stderr, "%s: %s\n", PROGRAM_NAME, strerror(errno)); exit(EXIT_FAILURE); } for (i = 0; optlist[i].optshort; i++) { char *param; char *description; char *start; char *end; if ('\0' == optlist[i].optshort[0]) { printf("\n"); continue; } param = optlist[i].param; if (param) param = _(param); description = optlist[i].description; if (description) description = _(description); #ifdef HAVE_SNPRINTF (void) snprintf(optbuf, (size_t) (col1max + 15), "%s%s%s%s%s", optlist[i].optshort, #else sprintf(optbuf, "%s%s%s%s%s", optlist[i].optshort, #endif #ifdef HAVE_GETOPT_LONG optlist[i].optlong ? ", " : "", optlist[i].optlong ? optlist[i].optlong : "", #else "", "", #endif param ? " " : "", param ? param : ""); printf(" %-*s ", (int) (col1max - 2), optbuf); if (NULL == description) { printf("\n"); continue; } start = description; while ((unsigned int) strlen(start) > tw - col1max) { end = start + tw - col1max; while ((end > start) && (end[0] != ' ')) end--; if (end == start) { end = start + tw - col1max; } else { end++; } printf("%.*s\n%*s ", (int) (end - start), start, (int) col1max, ""); if (end == start) end++; start = end; } printf("%s\n", start); } #ifdef ENABLE_DEBUGGING printf("\n"); printf("%s", _ ("Debugging is enabled; export the DEBUG environment variable to define the\noutput filename.\n")); #endif printf("\n"); printf(_("Please report any bugs to %s."), BUG_REPORTS_TO); printf("\n"); } /* EOF */