Subject: logname output is often wrong when linked with glibc

From: Nicolas Boos <[email-masked]>
Date: Sat, 8 Mar 2025 17:46:22 +0100

First test case with logname 9.1 and glibc 2.36:
$ echo $LOGNAME
nicolas
$ logname
nicolas
$ su --login root
$ echo $LOGNAME
root
$ logname
nicolas
$ logname (musl)
root
$ logname (uclibc)
root

Second test case, with a minimal chroot, no /proc and busybox login:
$ echo $LOGNAME
nicolas
$ logname
logname: no login name
$ busybox logname
logname: getlogin: No such file or directory
$ logname (musl)
nicolas
$ logname (uclibc)
nicolas

It seems getlogin() is malfunctioning only with glibc.

The following patch with "equivalent code" fixes the issue:
--- logname.c.orig
+++ logname.c
@@ -71,7 +71,11 @@
 
   /* POSIX requires using getlogin (or equivalent code) and prohibits
      using a fallback technique.  */
-  cp = getlogin ();
+  #if __GLIBC__
+    cp = getenv ("LOGNAME");
+  #else
+    cp = getlogin ();
+  #endif
   if (! cp)
     error (EXIT_FAILURE, 0, _("no login name"));

Adding a permanent fix to gnulib/getlogin.c code might be a better solution.

NB