bug#78244: Exit code 4 whilst installing util-linux-selinux on arch

Paul Eggert <[email protected]>
Newsgroups gmane.comp.gnu.core-utils.bugs
Organization UCLA Computer Science Department
Message-ID <[email protected]>
On 2025-05-04 02:49, Jdj asd wrote:
> I was trying to install util-linux-selinux which would've replaced a core
> package when I got exit code 4. I tried running it as root and with git
> clone but I was always getting this error and this email to report the
> issue to.

I installed the attached patch which should fix the test failure. Thanks 
for reporting it.
0001-tty-better-fix-for-Bug-26371.patch (text/x-patch, 4.2 KB)
From aec89a3e7dfaed1545b2dcaa8525df21cf61a37e Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email protected]>
Date: Fri, 20 Jun 2025 11:53:21 -0700
Subject: [PATCH] tty: better fix for Bug#26371

* src/tty.c (TTY_USAGE): Rename from TTY_FAILURE, since this
is used only for usage failures.  All uses changed.
(TTY_TTYNAME_FAILURE): New constant.
(main): Remove no-longer-needed assignment of ENOENT to errno.
Make status-setting clearer too.
Report an error if ttyname fails even though stdin is a terminal,
instead of silently pretending that stdin is not a terminal.
* tests/tty/tty.sh: Test for this issue.  This should fix Bug#78244.
---
 NEWS               |  5 +++++
 THANKS.in          |  1 +
 doc/coreutils.texi |  1 +
 src/tty.c          | 20 ++++++++++++--------
 tests/tty/tty.sh   | 10 ++++++++--
 5 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/NEWS b/NEWS
index 8f9ac26d0..50f27cd87 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,11 @@ GNU coreutils NEWS                                    -*- outline -*-
   'sort +0.18446744073709551615R input' on 64 bit systems.
   [bug introduced in coreutils-7.2]
 
+  tty now exits with status 4 with a special diagnostic if ttyname
+  fails even though standard input is a tty.  Formerly it quietly
+  pretended that standard input was not a tty.
+  [This bug was present in "the beginning".]
+
 ** Improvements
 
   stty supports setting arbitrary baud rates on supported systems,
diff --git a/THANKS.in b/THANKS.in
index 57ace387e..8c97a8138 100644
--- a/THANKS.in
+++ b/THANKS.in
@@ -120,6 +120,7 @@ Chris Lesniewski                    [email protected]
 Chris Sylvain                       [email protected]
 Chris Yeo                           [email protected]
 Christi Alice Scarborough           [email protected]
+Christian Brauner                   [email protected]
 Christian Harkort                   [email protected]
 Christian Jullien                   [email protected]
 Christian Krackowizer               [email protected]
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index 7556571d7..fc62c6d8d 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -16020,6 +16020,7 @@ Exit status:
 1 if standard input is a non-terminal file
 2 if given incorrect arguments
 3 if a write error occurs
+4 if the terminal's name cannot be determined
 @end display
 
 
diff --git a/src/tty.c b/src/tty.c
index b01f1a207..d5dea5200 100644
--- a/src/tty.c
+++ b/src/tty.c
@@ -33,8 +33,9 @@
 enum
   {
     TTY_STDIN_NOTTY = 1,
-    TTY_FAILURE = 2,
-    TTY_WRITE_ERROR = 3
+    TTY_USAGE = 2,
+    TTY_WRITE_ERROR = 3,
+    TTY_TTYNAME_FAILURE = 4
   };
 
 /* The official name of this program (e.g., no 'g' prefix).  */
@@ -103,26 +104,29 @@ main (int argc, char **argv)
         case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
 
         default:
-          usage (TTY_FAILURE);
+          usage (TTY_USAGE);
         }
     }
 
   if (optind < argc)
     {
       error (0, 0, _("extra operand %s"), quote (argv[optind]));
-      usage (TTY_FAILURE);
+      usage (TTY_USAGE);
     }
 
-  errno = ENOENT;
-
   if (silent)
     return isatty (STDIN_FILENO) ? EXIT_SUCCESS : TTY_STDIN_NOTTY;
 
-  int status = EXIT_SUCCESS;
+  int status;
   char const *tty = ttyname (STDIN_FILENO);
 
-  if (! tty)
+  if (tty)
+    status = EXIT_SUCCESS;
+  else
     {
+      int ttyname_err = errno;
+      if (isatty (STDIN_FILENO))
+        error (TTY_TTYNAME_FAILURE, ttyname_err, "ttyname");
       tty = _("not a tty");
       status = TTY_STDIN_NOTTY;
     }
diff --git a/tests/tty/tty.sh b/tests/tty/tty.sh
index 8201b42eb..b2b8aa25a 100755
--- a/tests/tty/tty.sh
+++ b/tests/tty/tty.sh
@@ -20,8 +20,14 @@
 . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
 print_ver_ tty
 
+tty_works_on_stdin=false
+
 if test -t 0; then
-  tty || fail=1
+  if tty; then
+    tty_works_on_stdin=true
+  else
+    test $? -eq 4 || fail=1
+  fi
   tty -s || fail=1
 fi
 
@@ -34,7 +40,7 @@ returns_ 2 tty a || fail=1
 returns_ 2 tty -s a || fail=1
 
 if test -w /dev/full && test -c /dev/full; then
-  if test -t 0; then
+  if $tty_works_on_stdin; then
     returns_ 3 tty >/dev/full || fail=1
   fi
   returns_ 3 tty </dev/null >/dev/full || fail=1
-- 
2.48.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.