bug#62385: POSIX behavior of readlink, realpath

Collin Funk <[email protected]>
Newsgroups gmane.comp.gnu.core-utils.bugs
Message-ID <[email protected]>
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
v2-0001-readlink-emit-errors-when-POSIXLY_CORRECT-is-set.patch (text/x-patch, 4.7 KB)
From ecd803805d2ce49e46babd3657c455d9b2419102 Mon Sep 17 00:00:00 2001
Message-ID: <ecd803805d2ce49e46babd3657c455d9b2419102.1754244139.git.collin.funk1@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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.