Hi Pádraig,
Pádraig Brady <[email protected]> writes:
> I'd say any option apart from -n implicitly disables strict POSIX conformance,
> since those options are not in POSIX at all.
It seems like this was my misunderstanding. I thought non-POSIX options
couldn't change:
If file does not name a symbolic link, readlink shall write a
diagnostic message to standard error and exit with non-zero status.
But I like the behavior you and Dmitry suggest better.
> So all I'd do is enable -v if POSIXLY_CORRECT is set. There is the
> argument for defaulting to -v, but I see FreeBSD does not output an
> error either if file is not a symlink, so it's probably best to only
> enable -v if POSIXLY_CORRECT is set.
>
> In NEWS this should be under "Changes in behavior" rather than "New Features".
Done, v2 attached.
Collin
>From ecd803805d2ce49e46babd3657c455d9b2419102 Mon Sep 17 00:00:00 2001
Message-ID: <ecd803805d2ce49e46babd3657c455d9b2419102.1754244139.git.collin.fu...@gmail.com>
From: Collin Funk <[email protected]>
Date: Sat, 2 Aug 2025 20:51:30 -0700
Subject: [PATCH v2] readlink: emit errors when POSIXLY_CORRECT is set
* src/readlink.c (main): Set verbose if the POSIXLY_CORRECT environment
variable is set.
* tests/readlink/readlink-posix.sh: New file.
* tests/local.mk (all_tests): Add it.
* NEWS: Mention the change.
* doc/coreutils.texi (readlink invocation): Document the behavior of
POSIXLY_CORRECT.
---
NEWS | 3 ++
doc/coreutils.texi | 4 +++
src/readlink.c | 6 ++++
tests/local.mk | 1 +
tests/readlink/readlink-posix.sh | 48 ++++++++++++++++++++++++++++++++
5 files changed, 62 insertions(+)
create mode 100755 tests/readlink/readlink-posix.sh
diff --git a/NEWS b/NEWS
index 110e688b1..9839aeb87 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,9 @@ GNU coreutils NEWS -*- outline -*-
'factor' is now much faster at identifying large prime numbers,
and significantly faster on composite numbers greater than 2^128.
+ readlink will behave as if the -v option is used if the
+ POSIXLY_CORRECT environment variable is defined.
+
** Bug fixes
cksum was not compilable by Apple LLVM 10.0.0 x86-64, which
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 40ecf3126..f268c9249 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -11470,6 +11470,10 @@ @node readlink invocation
@opindex --verbose
Report error messages.
+@vindex POSIXLY_CORRECT
+This option is on by default if the @env{POSIXLY_CORRECT} environment
+variable is set.
+
@optZero
@end table
diff --git a/src/readlink.c b/src/readlink.c
index 44def1dbb..9e7f2320a 100644
--- a/src/readlink.c
+++ b/src/readlink.c
@@ -152,12 +152,18 @@ main (int argc, char **argv)
no_newline = false;
}
+ /* POSIX requires a diagnostic message written to standard error and a
+ non-zero exit status when given a file that is not a symbolic link. */
+ if (getenv ("POSIXLY_CORRECT") != nullptr)
+ verbose = true;
+
for (; optind < argc; ++optind)
{
char const *fname = argv[optind];
char *value = (can_mode != -1
? canonicalize_filename_mode (fname, can_mode)
: areadlink_with_size (fname, 63));
+
if (value)
{
fputs (value, stdout);
diff --git a/tests/local.mk b/tests/local.mk
index 6b527f108..7364ec89f 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -365,6 +365,7 @@ all_tests = \
tests/printf/printf-quote.sh \
tests/pwd/pwd-long.sh \
tests/readlink/readlink-fp-loop.sh \
+ tests/readlink/readlink-posix.sh \
tests/readlink/readlink-root.sh \
tests/misc/realpath.sh \
tests/runcon/runcon-compute.sh \
diff --git a/tests/readlink/readlink-posix.sh b/tests/readlink/readlink-posix.sh
new file mode 100755
index 000000000..2dcc2e601
--- /dev/null
+++ b/tests/readlink/readlink-posix.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+# Test readlink with POSIXLY_CORRECT defined.
+
+# Copyright (C) 2025 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
+print_ver_ readlink
+
+touch file || framework_failure_
+ln -s file link1 || framework_failure_
+
+# POSIX requires a diagnostic error and non-zero exit status if the file is not
+# a symbolic link.
+cat <<\EOF > exp || framework_failure_
+readlink: file: Invalid argument
+EOF
+returns_ 1 env POSIXLY_CORRECT=1 readlink file 2>err || fail=1
+compare exp err || fail=1
+
+# Does not occur for non-POSIX options.
+env POSIXLY_CORRECT=1 readlink -f file || fail=1
+env POSIXLY_CORRECT=1 readlink -e file || fail=1
+env POSIXLY_CORRECT=1 readlink -m file || fail=1
+
+# Check on a symbolic link.
+cat <<\EOF > exp || framework_failure_
+file
+EOF
+POSIXLY_CORRECT=1 readlink link1 >out || fail=1
+compare exp out || fail=1
+POSIXLY_CORRECT=1 readlink -f link1 || fail=1
+POSIXLY_CORRECT=1 readlink -e link1 || fail=1
+POSIXLY_CORRECT=1 readlink -m link1 || fail=1
+
+Exit $fail
--
2.50.1