git: e6d9c11666f7 - stable/14 - ls: Make -, apply to -s as well as -l.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 01 Aug 2024 16:16:49 UTC
The branch stable/14 has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=e6d9c11666f785ec45cb6f7e05fc87012d6bb4d5 commit e6d9c11666f785ec45cb6f7e05fc87012d6bb4d5 Author: Dag-Erling Smørgrav <des@FreeBSD.org> AuthorDate: 2024-07-24 20:06:39 +0000 Commit: Dag-Erling Smørgrav <des@FreeBSD.org> CommitDate: 2024-08-01 16:15:57 +0000 ls: Make -, apply to -s as well as -l. While here, remove a bogus comment about a gcc bug. The bug was in ls, which used an incorrect format string, and in libc, which accepted it. MFC after: 1 week Reviewed by: brooks Differential Revision: https://reviews.freebsd.org/D46067 (cherry picked from commit 647d4a8cafd2c9b291cab388191bc7fcfe12a66b) --- bin/ls/ls.1 | 4 +++- bin/ls/ls.c | 3 ++- bin/ls/print.c | 14 ++++++-------- bin/ls/tests/ls_tests.sh | 16 ++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/bin/ls/ls.1 b/bin/ls/ls.1 index 1b0f24593adc..4d20f02261c9 100644 --- a/bin/ls/ls.1 +++ b/bin/ls/ls.1 @@ -31,7 +31,7 @@ .\" .\" @(#)ls.1 8.7 (Berkeley) 7/29/94 .\" -.Dd February 21, 2024 +.Dd July 22, 2024 .Dt LS 1 .Os .Sh NAME @@ -436,6 +436,8 @@ output is not to a terminal. .It Fl , (Comma) When the .Fl l +or +.Fl s option is set, print file sizes grouped and separated by thousands using the non-monetary separator returned by .Xr localeconv 3 , diff --git a/bin/ls/ls.c b/bin/ls/ls.c index 59ff12547787..1ad346440f02 100644 --- a/bin/ls/ls.c +++ b/bin/ls/ls.c @@ -981,7 +981,8 @@ label_out: d.maxlen = maxlen; if (needstats) { d.btotal = btotal; - d.s_block = snprintf(NULL, 0, "%lu", howmany(maxblock, blocksize)); + d.s_block = snprintf(NULL, 0, f_thousands ? "%'ld" : "%ld", + howmany(maxblock, blocksize)); d.s_flags = maxflags; d.s_label = maxlabelstr; d.s_group = maxgroup; diff --git a/bin/ls/print.c b/bin/ls/print.c index 16c4f48624d0..417586665eb1 100644 --- a/bin/ls/print.c +++ b/bin/ls/print.c @@ -227,7 +227,7 @@ printlong(const DISPLAY *dp) (void)printf("%*ju ", dp->s_inode, (uintmax_t)sp->st_ino); if (f_size) - (void)printf("%*jd ", + (void)printf(f_thousands ? "%'*jd " : "%*jd ", dp->s_block, howmany(sp->st_blocks, blocksize)); strmode(sp->st_mode, buf); aclmode(buf, p); @@ -406,7 +406,7 @@ printaname(const FTSENT *p, u_long inodefield, u_long sizefield) chcnt += printf("%*ju ", (int)inodefield, (uintmax_t)sp->st_ino); if (f_size) - chcnt += printf("%*jd ", + chcnt += printf(f_thousands ? "%'*jd " : "%*jd ", (int)sizefield, howmany(sp->st_blocks, blocksize)); #ifdef COLORLS if (f_color) @@ -759,12 +759,10 @@ printsize(size_t width, off_t bytes) humanize_number(buf, sizeof(buf), (int64_t)bytes, "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL); (void)printf("%*s ", (u_int)width, buf); - } else if (f_thousands) { /* with commas */ - /* This format assignment needed to work round gcc bug. */ - const char *format = "%*j'd "; - (void)printf(format, (u_int)width, bytes); - } else - (void)printf("%*jd ", (u_int)width, bytes); + } else { + (void)printf(f_thousands ? "%'*jd " : "%*jd ", + (u_int)width, bytes); + } } /* diff --git a/bin/ls/tests/ls_tests.sh b/bin/ls/tests/ls_tests.sh index c82b4e8c8851..c732b60b21a4 100755 --- a/bin/ls/tests/ls_tests.sh +++ b/bin/ls/tests/ls_tests.sh @@ -800,6 +800,21 @@ s_flag_body() done } +atf_test_case scomma_flag +scomma_flag_head() +{ + atf_set "descr" "Verify that -s, prints out the size with ',' delimiters" +} + +scomma_flag_body() +{ + export LC_ALL=en_US.UTF-8 + atf_check -e ignore dd if=/dev/urandom of=file bs=65536 count=64 + blocks=$(stat -f "%b" file) + cblocks=$(printf "%'d" $blocks) + atf_check -e empty -o match:"$cblocks[[:space:]]+file" ls -s, file +} + atf_test_case t_flag t_flag_head() { @@ -972,6 +987,7 @@ atf_init_test_cases() atf_add_test_case q_flag_and_w_flag atf_add_test_case r_flag atf_add_test_case s_flag + atf_add_test_case scomma_flag atf_add_test_case t_flag atf_add_test_case u_flag atf_add_test_case v_flag