From 34a93b971dd68ab8ff96aa20bf2f39374ab3a443 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 22 Jul 2022 13:50:31 -0700 Subject: [PATCH] stat: -c %s now prints unsigned * src/stat.c (unsigned_file_size): New static function, copied from src/ls.c. (print_stat): %s prints an unsigned value now (Bug#56710). --- NEWS | 2 ++ src/stat.c | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index b4e3cf83a..816025255 100644 --- a/NEWS +++ b/NEWS @@ -25,6 +25,8 @@ GNU coreutils NEWS -*- outline -*- reverting to the behavior in coreutils-9.0 and earlier. This behavior is now documented. + ’stat -c %s' now prints sizes as unsigned, consistent with 'ls'. + ** New Features factor now accepts the --exponents (-h) option to print factors diff --git a/src/stat.c b/src/stat.c index 3765a8f65..549762aba 100644 --- a/src/stat.c +++ b/src/stat.c @@ -1492,6 +1492,14 @@ do_stat (char const *filename, char const *format, } #endif /* USE_STATX */ +/* POSIX requires 'ls' to print file sizes without a sign, even + when negative. Be consistent with that. */ + +static uintmax_t +unsigned_file_size (off_t size) +{ + return size + (size < 0) * ((uintmax_t) OFF_T_MAX - OFF_T_MIN + 1); +} /* Print stat info. Return zero upon success, nonzero upon failure. */ static bool @@ -1575,7 +1583,7 @@ print_stat (char *pformat, size_t prefix_len, char mod, char m, fail |= out_mount_point (filename, pformat, prefix_len, statbuf); break; case 's': - out_int (pformat, prefix_len, statbuf->st_size); + out_uint (pformat, prefix_len, unsigned_file_size (statbuf->st_size)); break; case 'r': if (mod == 'H') -- 2.37.1