diff options
author | Pádraig Brady <P@draigBrady.com> | 2014-12-16 12:36:39 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2014-12-19 11:56:20 +0000 |
commit | 6894816c653adef54f3a85becbf75a865d6d39d6 (patch) | |
tree | 82bb3126d3c8cfaeebc950bd03a52a4f5e0f056c /src/tail.c | |
parent | 178f8e79dcd1e0b8bbb3b04da664d05eaae56186 (diff) | |
download | coreutils-6894816c653adef54f3a85becbf75a865d6d39d6.tar.xz |
diagnose too-large numbers better
Following on from commit v8.23-82-gaddae94, consistently diagnose
numbers that are too large, so as to distinguish from other errors,
and make the limits obvious.
* gl/modules/xdectoint: A new module implementing xdecto[iu]max(),
which handles the common case of parsing a bounded integer and
exiting with a diagnostic on error.
* gl/lib/xdectoimax.c: The signed variant.
* gl/lib/xdectoint.c: The parameterized implementation.
* gl/lib/xdectoint.h: The interface.
* gl/lib/xdectoumax.c: The unsigned variant.
* bootstrap.conf: Reference the new module.
* cfg.mk (exclude_file_name_regexp--sc_require_config_h_first):
Exclude the parameterized templates.
* src/csplit.c: Output EOVERFLOW or ERANGE errors if appropriate.
* src/fmt.c: Likewise.
* src/fold.c: Likewise.
* src/head.c: Likewise.
* src/ls.c: Likewise.
* src/nl.c: Likewise.
* src/nproc.c: Likewise.
* src/shred.c: Likewise.
* src/shuf.c: Likewise.
* src/stdbuf.c: Likewise.
* src/stty.c: Likewise.
* src/tail.c: Likewise.
* src/truncate.c: Likewise.
* src/split.c: Likewise.
* src/pr.c: Likewise.
* tests/pr/pr-tests.pl: Adjust to avoid matching errno diagnostic.
* tests/fmt/base.pl: Likewise.
* tests/split/l-chunk.sh: Likewise.
* tests/misc/shred-negative.sh: Likewise.
* tests/misc/tail.pl: Likewise. Also remove the redundant
existing ERR_SUBST from test err-6.
* tests/ls/hex-option.sh: Check HEX/OCT options.
* tests/misc/shred-size.sh: Likewise.
* tests/misc/stty-row-col.sh: Likewise.
Diffstat (limited to 'src/tail.c')
-rw-r--r-- | src/tail.c | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/src/tail.c b/src/tail.c index 4c5f943c7..28524d71f 100644 --- a/src/tail.c +++ b/src/tail.c @@ -44,6 +44,7 @@ #include "stat-time.h" #include "xfreopen.h" #include "xnanosleep.h" +#include "xdectoint.h" #include "xstrtol.h" #include "xstrtod.h" @@ -1949,7 +1950,10 @@ parse_obsolete_option (int argc, char * const *argv, uintmax_t *n_units) else if ((xstrtoumax (n_string, NULL, 10, n_units, "b") & ~LONGINT_INVALID_SUFFIX_CHAR) != LONGINT_OK) - error (EXIT_FAILURE, 0, _("number in %s is too large"), quote (argv[1])); + { + error (EXIT_FAILURE, errno, "%s: %s", _("invalid number"), + quote (argv[1])); + } /* Set globals. */ from_start = t_from_start; @@ -1986,17 +1990,10 @@ parse_options (int argc, char **argv, else if (*optarg == '-') ++optarg; - { - strtol_error s_err; - s_err = xstrtoumax (optarg, NULL, 10, n_units, "bkKmMGTPEZY0"); - if (s_err != LONGINT_OK) - { - error (EXIT_FAILURE, 0, "%s: %s", optarg, - (c == 'n' - ? _("invalid number of lines") - : _("invalid number of bytes"))); - } - } + *n_units = xdectoumax (optarg, 0, UINTMAX_MAX, "bkKmMGTPEZY0", + count_lines + ? _("invalid number of lines") + : _("invalid number of bytes"), 0); break; case 'f': @@ -2015,15 +2012,9 @@ parse_options (int argc, char **argv, case MAX_UNCHANGED_STATS_OPTION: /* --max-unchanged-stats=N */ - if (xstrtoumax (optarg, NULL, 10, - &max_n_unchanged_stats_between_opens, - "") - != LONGINT_OK) - { - error (EXIT_FAILURE, 0, - _("%s: invalid maximum number of unchanged stats between opens"), - optarg); - } + max_n_unchanged_stats_between_opens = + xdectoumax (optarg, 0, UINTMAX_MAX, "", + _("invalid maximum number of unchanged stats between opens"), 0); break; case DISABLE_INOTIFY_OPTION: @@ -2031,16 +2022,7 @@ parse_options (int argc, char **argv, break; case PID_OPTION: - { - strtol_error s_err; - unsigned long int tmp_ulong; - s_err = xstrtoul (optarg, NULL, 10, &tmp_ulong, ""); - if (s_err != LONGINT_OK || tmp_ulong > PID_T_MAX) - { - error (EXIT_FAILURE, 0, _("%s: invalid PID"), optarg); - } - pid = tmp_ulong; - } + pid = xdectoumax (optarg, 0, PID_T_MAX, "", _("invalid PID"), 0); break; case PRESUME_INPUT_PIPE_OPTION: @@ -2056,7 +2038,7 @@ parse_options (int argc, char **argv, double s; if (! (xstrtod (optarg, NULL, &s, c_strtod) && 0 <= s)) error (EXIT_FAILURE, 0, - _("%s: invalid number of seconds"), optarg); + _("invalid number of seconds: %s"), quote (optarg)); *sleep_interval = s; } break; |