Hi Pádraig, Pádraig Brady <p...@draigbrady.com> 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 <collin.fu...@gmail.com> 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