From 64d086cbfe0189634d053683cf3ab918214ede32 Mon Sep 17 00:00:00 2001 From: =?latin1?q?P=E1draig=20Brady?= Date: Thu, 27 Nov 2014 00:51:00 +0000 Subject: rm: fix prompted number of arguments to remove on some platforms "zu" was output on solaris 8 for example rather than the number, since coreutils-8.22. * cfg.mk: Disallow %z, since we don't currently use the gnulib fprintf module, so any usage with it is non portable. Also our usage with error() currently works only through an ancillary dependency on the vfprintf gnulib module. * src/rm.c (main): Use %PRIuMAX rather than %zu for portability. * src/dd.c (alloc_[io]buf): Likewise for consistency. * src/od.c (main): Likewise. * src/split.c (set_suffix_length): Likewise. * NEWS: Mention the rm bug fix. Reported in http://bugs.gnu.org/19184 (cherry picked from commit 7d1fe8868e29ae2644831685df4a29638721d6ba) Conflicts: NEWS --- cfg.mk | 17 +++++++++-------- src/dd.c | 5 +++-- src/od.c | 3 ++- src/rm.c | 10 +++++----- src/split.c | 4 ++-- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/cfg.mk b/cfg.mk index 6d96e1b..69c5628 100644 --- a/cfg.mk +++ b/cfg.mk @@ -214,14 +214,15 @@ sc_check-I18N-AUTHORS: '$$(LIBICONV)' 1>&2; exit 1; }; \ done -# Ensure %j is not used for intmax_t as it's not universally supported. -# There are issues on HPUX for example. But note that %ju was used between -# coreutils 8.13 (2011-10) and 8.20 (2012-10) without any reported issue, -# and the particular issue this check is associated with was for %*jx. -# So we may be able to relax this restriction soon. -sc_prohibit-j-printf-format: - @cd $(srcdir)/src && GIT_PAGER= git grep -n '%[0*]*j[udx]' *.c \ - && { echo '$(ME): Use PRI*MAX instead of %j' 1>&2; exit 1; } \ +# Disallow the C99 printf size specifiers %z and %j as they're not portable. +# The gnulib printf replacement does support them, however the printf +# replacement is not currently explicitly depended on by the gnulib error() +# module for example. Also we use fprintf() in a few places to output simple +# formats but don't use the gnulib module as it is seen as overkill at present. +# We'd have to adjust the above gnulib items before disabling this. +sc_prohibit-c99-printf-format: + @cd $(srcdir)/src && GIT_PAGER= git grep -n '%[0*]*[jz][udx]' *.c \ + && { echo '$(ME): Use PRI*MAX instead of %j or %z' 1>&2; exit 1; } \ || : # Ensure the alternative __attribute (keyword) form isn't used as diff --git a/src/dd.c b/src/dd.c index f78de1d..9e17f02 100644 --- a/src/dd.c +++ b/src/dd.c @@ -665,7 +665,7 @@ alloc_ibuf (void) char *real_buf = malloc (input_blocksize + INPUT_BLOCK_SLOP); if (!real_buf) error (EXIT_FAILURE, 0, - _("memory exhausted by input buffer of size %zu bytes (%s)"), + _("memory exhausted by input buffer of size %"PRIuMAX" bytes (%s)"), input_blocksize, human_size (input_blocksize)); real_buf += SWAB_ALIGN_OFFSET; /* allow space for swab */ @@ -687,7 +687,8 @@ alloc_obuf (void) char *real_obuf = malloc (output_blocksize + OUTPUT_BLOCK_SLOP); if (!real_obuf) error (EXIT_FAILURE, 0, - _("memory exhausted by output buffer of size %zu bytes (%s)"), + _("memory exhausted by output buffer of size %"PRIuMAX + " bytes (%s)"), output_blocksize, human_size (output_blocksize)); obuf = ptr_align (real_obuf, page_size); } diff --git a/src/od.c b/src/od.c index e26518c..2e00fb1 100644 --- a/src/od.c +++ b/src/od.c @@ -1962,7 +1962,8 @@ main (int argc, char **argv) } #ifdef DEBUG - printf ("lcm=%d, width_per_block=%zu\n", l_c_m, width_per_block); + printf ("lcm=%d, width_per_block=%"PRIuMAX"\n", l_c_m, + (uintmax_t) width_per_block); for (i = 0; i < n_specs; i++) { int fields_per_block = bytes_per_block / width_bytes[spec[i].size]; diff --git a/src/rm.c b/src/rm.c index 5baea15..a87e26d 100644 --- a/src/rm.c +++ b/src/rm.c @@ -332,18 +332,18 @@ main (int argc, char **argv) quote ("/")); } - size_t n_files = argc - optind; + uintmax_t n_files = argc - optind; char **file = argv + optind; if (prompt_once && (x.recursive || 3 < n_files)) { fprintf (stderr, (x.recursive - ? ngettext ("%s: remove %zu argument recursively? ", - "%s: remove %zu arguments recursively? ", + ? ngettext ("%s: remove %"PRIuMAX" argument recursively? ", + "%s: remove %"PRIuMAX" arguments recursively? ", select_plural (n_files)) - : ngettext ("%s: remove %zu argument? ", - "%s: remove %zu arguments? ", + : ngettext ("%s: remove %"PRIuMAX" argument? ", + "%s: remove %"PRIuMAX" arguments? ", select_plural (n_files))), program_name, n_files); if (!yesno ()) diff --git a/src/split.c b/src/split.c index ba74797..b05b17f 100644 --- a/src/split.c +++ b/src/split.c @@ -158,7 +158,7 @@ set_suffix_length (uintmax_t n_units, enum Split_type split_type) { #define DEFAULT_SUFFIX_LENGTH 2 - size_t suffix_needed = 0; + uintmax_t suffix_needed = 0; /* The suffix auto length feature is incompatible with a user specified start value as the generated suffixes @@ -183,7 +183,7 @@ set_suffix_length (uintmax_t n_units, enum Split_type split_type) if (suffix_length < suffix_needed) { error (EXIT_FAILURE, 0, - _("the suffix length needs to be at least %zu"), + _("the suffix length needs to be at least %"PRIuMAX), suffix_needed); } suffix_auto = false; -- 1.7.12.1