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/truncate.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/truncate.c')
-rw-r--r-- | src/truncate.c | 36 |
1 files changed, 5 insertions, 31 deletions
diff --git a/src/truncate.c b/src/truncate.c index f06668de5..e4ef5e733 100644 --- a/src/truncate.c +++ b/src/truncate.c @@ -29,7 +29,7 @@ #include "error.h" #include "quote.h" #include "stat-size.h" -#include "xstrtol.h" +#include "xdectoint.h" /* The official name of this program (e.g., no 'g' prefix). */ #define PROGRAM_NAME "truncate" @@ -59,33 +59,6 @@ static struct option const longopts[] = typedef enum { rm_abs = 0, rm_rel, rm_min, rm_max, rm_rdn, rm_rup } rel_mode_t; -/* Set size to the value of STR, interpreted as a decimal integer, - optionally multiplied by various values. - Return -1 on error, 0 on success. - - This supports dd BLOCK size suffixes + lowercase g,t,m for bsd compat - Note we don't support dd's b=512, c=1, w=2 or 21x512MiB formats. */ -static int -parse_len (char const *str, off_t *size) -{ - enum strtol_error e; - intmax_t tmp_size; - e = xstrtoimax (str, NULL, 10, &tmp_size, "EgGkKmMPtTYZ0"); - if (e == LONGINT_OK - && !(OFF_T_MIN <= tmp_size && tmp_size <= OFF_T_MAX)) - e = LONGINT_OVERFLOW; - - if (e == LONGINT_OK) - { - errno = 0; - *size = tmp_size; - return 0; - } - - errno = (e == LONGINT_OVERFLOW ? EOVERFLOW : 0); - return -1; -} - void usage (int status) { @@ -306,9 +279,10 @@ main (int argc, char **argv) } rel_mode = rm_rel; } - if (parse_len (optarg, &size) == -1) - error (EXIT_FAILURE, errno, _("invalid number %s"), - quote (optarg)); + /* Support dd BLOCK size suffixes + lowercase g,t,m for bsd compat. + Note we don't support dd's b=512, c=1, w=2 or 21x512MiB formats. */ + size = xdectoimax (optarg, OFF_T_MIN, OFF_T_MAX, "EgGkKmMPtTYZ0", + _("Invalid number"), 0); /* Rounding to multiple of 0 is nonsensical */ if ((rel_mode == rm_rup || rel_mode == rm_rdn) && size == 0) error (EXIT_FAILURE, 0, _("division by zero")); |