]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
readlink: emit errors when POSIXLY_CORRECT is set
authorCollin Funk <collin.funk1@gmail.com>
Sun, 3 Aug 2025 03:51:30 +0000 (20:51 -0700)
committerCollin Funk <collin.funk1@gmail.com>
Sun, 3 Aug 2025 17:55:54 +0000 (10:55 -0700)
* 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
doc/coreutils.texi
src/readlink.c
tests/local.mk
tests/readlink/readlink-posix.sh [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index 110e688b10558c31f0ea4950129fa588a4e53634..9839aeb87b6a5f5c1468fae527a7a062fcc62b0b 100644 (file)
--- 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
index 40ecf3126f7c27f8ee550e9ec760083e00b50251..f268c9249b5fb4cfcf7cbbf950171eede54c962f 100644 (file)
@@ -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
index 44def1dbb0e28339bd999cf8bd737d8fa56118ce..9e7f2320a57da1cfb73dcaea0a27044fa00d617c 100644 (file)
@@ -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);
index 6b527f10824f9c7ae00ba8d6fec80d915b0018ed..7364ec89fa5d0630d96efa3875d44c00eec40bcf 100644 (file)
@@ -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 (executable)
index 0000000..2dcc2e6
--- /dev/null
@@ -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