git: 600504767528 - stable/13 - 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:46:52 UTC
The branch stable/13 has been updated by des:
URL: https://cgit.FreeBSD.org/src/commit/?id=600504767528cce6b0e4f9eb44e9d4cec856abc8
commit 600504767528cce6b0e4f9eb44e9d4cec856abc8
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:42:33 +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 e8b9835e6038..ccb9087dd764 100644
--- a/bin/ls/ls.1
+++ b/bin/ls/ls.1
@@ -31,7 +31,7 @@
.\"
.\" @(#)ls.1 8.7 (Berkeley) 7/29/94
.\"
-.Dd October 31, 2022
+.Dd July 22, 2024
.Dt LS 1
.Os
.Sh NAME
@@ -439,6 +439,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 a04e455e8b06..6338e8c19581 100644
--- a/bin/ls/ls.c
+++ b/bin/ls/ls.c
@@ -968,7 +968,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 3d6feff1fdb7..e67596c198ba 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);
@@ -404,7 +404,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)
@@ -757,12 +757,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 682682691b7a..780376b9de3c 100755
--- a/bin/ls/tests/ls_tests.sh
+++ b/bin/ls/tests/ls_tests.sh
@@ -799,6 +799,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()
{
@@ -971,6 +986,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