From ecd803805d2ce49e46babd3657c455d9b2419102 Mon Sep 17 00:00:00 2001 From: Collin Funk Date: Sat, 2 Aug 2025 20:51:30 -0700 Subject: [PATCH] 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 110e688b10..9839aeb87b 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 40ecf3126f..f268c9249b 100644 --- a/doc/coreutils.texi +++ b/doc/coreutils.texi @@ -11470,6 +11470,10 @@ Suppress most error messages. On by default. @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 44def1dbb0..9e7f2320a5 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 6b527f1082..7364ec89fa 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 0000000000..2dcc2e601d --- /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 . + +. "${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.47.2