aboutsummaryrefslogtreecommitdiff
path: root/bin/ls
diff options
context:
space:
mode:
authorMinsoo Choo <minsoochoo0122@proton.me>2023-07-18 16:49:59 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2023-07-18 17:03:09 +0000
commit3bfbb521fef5764ecabc2bf3fdc76f47258171f8 (patch)
treeafab62cfc2dd852488de37f41135715a6314a9ff /bin/ls
parentd5e2d0f140cef6d09c4ddeb594cee027642366a7 (diff)
downloadsrc-3bfbb521fef5764ecabc2bf3fdc76f47258171f8.tar.gz
src-3bfbb521fef5764ecabc2bf3fdc76f47258171f8.zip
ls: Improve POSIX compatibility for -g and -n.
- Change -g (ignored for BSD 4.3 compatibility since BSD 4.4) to use POSIX semantics of implying -l but omitting the owner's name. - Change -n to imply -l. The -o option remains unchanged (POSIX defines -o as a complement to -g that implies -l but omits group names whereas BSD defines -o to add file flags to -l). This compromise is the same used by both NetBSD and OpenBSD. PR: 70813 Reviewed by: jhb, Pau Amma <pauamma@gundo.com> Co-authored-by: John Baldwin <jhb@FreeBSD.org> Differential Revision: https://reviews.freebsd.org/D34747
Diffstat (limited to 'bin/ls')
-rw-r--r--bin/ls/ls.111
-rw-r--r--bin/ls/ls.c10
-rw-r--r--bin/ls/ls.h1
-rw-r--r--bin/ls/print.c8
-rwxr-xr-xbin/ls/tests/ls_tests.sh19
5 files changed, 28 insertions, 21 deletions
diff --git a/bin/ls/ls.1 b/bin/ls/ls.1
index fb1b4f6ba606..b3563eb38921 100644
--- a/bin/ls/ls.1
+++ b/bin/ls/ls.1
@@ -32,7 +32,7 @@
.\" @(#)ls.1 8.7 (Berkeley) 7/29/94
.\" $FreeBSD$
.\"
-.Dd October 31, 2022
+.Dd July 18, 2023
.Dt LS 1
.Os
.Sh NAME
@@ -301,14 +301,9 @@ and
.Fl s
options.
.It Fl g
-This option has no effect.
-It is only available for compatibility with
-.Bx 4.3 ,
-where it was used to display the group name in the long
+Display the long
.Pq Fl l
-format output.
-This option is incompatible with
-.St -p1003.1-2008 .
+format output without the file owner's name or number.
.It Fl h
When used with the
.Fl l
diff --git a/bin/ls/ls.c b/bin/ls/ls.c
index bd7bd283c317..b027e34afc2c 100644
--- a/bin/ls/ls.c
+++ b/bin/ls/ls.c
@@ -144,6 +144,7 @@ static int f_singlecol; /* use single column output */
static int f_sizesort;
int f_slash; /* similar to f_type, but only for dirs */
int f_sortacross; /* sort across rows, not down columns */
+ int f_sowner; /* disable showing owner's name */
int f_statustime; /* use time of last mode change */
static int f_stream; /* stream the output, separate with commas */
int f_thousands; /* show file sizes with thousands separators */
@@ -402,7 +403,11 @@ main(int argc, char *argv[])
f_listdir = 1;
f_recursive = 0;
break;
- case 'g': /* Compatibility with 4.3BSD. */
+ case 'g':
+ f_longform = 1;
+ f_singlecol = 0;
+ f_stream = 0;
+ f_sowner = 1;
break;
case 'h':
f_humanval = 1;
@@ -421,6 +426,9 @@ main(int argc, char *argv[])
break;
case 'n':
f_numericonly = 1;
+ f_longform = 1;
+ f_singlecol = 0;
+ f_stream = 0;
break;
case 'o':
f_flags = 1;
diff --git a/bin/ls/ls.h b/bin/ls/ls.h
index 410246ec9903..1f19858720bf 100644
--- a/bin/ls/ls.h
+++ b/bin/ls/ls.h
@@ -56,6 +56,7 @@ extern int f_sectime; /* print the real time for all files */
extern int f_size; /* list size in short listing */
extern int f_slash; /* append a '/' if the file is a directory */
extern int f_sortacross; /* sort across rows, not down columns */
+extern int f_sowner; /* disable showing the owner's name */
extern int f_statustime; /* use time of last mode change */
extern int f_thousands; /* show file sizes with thousands separators */
extern char *f_timeformat; /* user-specified time format */
diff --git a/bin/ls/print.c b/bin/ls/print.c
index 5e8a54ca0620..b01b2e1e61db 100644
--- a/bin/ls/print.c
+++ b/bin/ls/print.c
@@ -234,9 +234,11 @@ printlong(const DISPLAY *dp)
strmode(sp->st_mode, buf);
aclmode(buf, p);
np = p->fts_pointer;
- (void)printf("%s %*ju %-*s %-*s ", buf, dp->s_nlink,
- (uintmax_t)sp->st_nlink, dp->s_user, np->user, dp->s_group,
- np->group);
+ (void)printf("%s %*ju ", buf, dp->s_nlink,
+ (uintmax_t)sp->st_nlink);
+ if (!f_sowner)
+ (void)printf("%-*s ", dp->s_user, np->user);
+ (void)printf("%-*s ", dp->s_group, np->group);
if (f_flags)
(void)printf("%-*s ", dp->s_flags, np->flags);
if (f_label)
diff --git a/bin/ls/tests/ls_tests.sh b/bin/ls/tests/ls_tests.sh
index 117156b5cb0e..a85e43ecb938 100755
--- a/bin/ls/tests/ls_tests.sh
+++ b/bin/ls/tests/ls_tests.sh
@@ -525,18 +525,19 @@ f_flag_body()
atf_test_case g_flag
g_flag_head()
{
- atf_set "descr" "Verify that -g does nothing (compatibility flag)"
+ atf_set "descr" "Verify that -g implies -l but omits the owner name field"
}
g_flag_body()
{
- create_test_inputs2
- for file in $files; do
- atf_check -e empty -o match:"$(ls -a $file)" -s exit:0 \
- ls -ag $file
- atf_check -e empty -o match:"$(ls -la $file)" -s exit:0 \
- ls -alg $file
- done
+ atf_check -e empty -o empty -s exit:0 touch a.file
+
+ mtime_in_secs=$(stat -f "%m" -t "%s" a.file)
+ mtime=$(date -j -f "%s" $mtime_in_secs +"%b[[:space:]]+%e[[:space:]]+%H:%M")
+
+ expected_output=$(stat -f "%Sp[[:space:]]+%l[[:space:]]+%Sg[[:space:]]+%z[[:space:]]+$mtime[[:space:]]+a\\.file" a.file)
+
+ atf_check -e empty -o match:"$expected_output" -s exit:0 ls -g a.file
}
atf_test_case h_flag
@@ -689,7 +690,7 @@ n_flag_body()
atf_check -e empty \
-o match:'\-rw\-r\-\-r\-\-[[:space:]]+1[[:space:]]+'"$nobody_uid[[:space:]]+$daemon_gid"'[[:space:]]+.+a\.file' \
- ls -ln a.file
+ ls -n a.file
}