changeset 17656:2b0bea4ad42e

getlogin-tests: avoid false failure under sudo/ssh etc. * modules/getlogin-tests (configure.ac): Check for ttyname(). * tests/test-getlogin.c (main): Don't depend on environment variables to correlate with getlogin(), since sudo and ssh etc. can tamper with the LOGNAME and USER env vars. Instead lookup the name from the uid associated with the stdin tty.
author Guilherme de Almeida Suckevicz <guito.linux@gmail.com>
date Wed, 14 May 2014 22:06:24 +0100
parents 889867abe1ae
children ff09c8d33967
files ChangeLog modules/getlogin-tests tests/test-getlogin.c
diffstat 3 files changed, 41 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun May 11 00:36:37 2014 -0700
+++ b/ChangeLog	Wed May 14 22:06:24 2014 +0100
@@ -1,3 +1,12 @@
+2014-05-14  Guilherme de Almeida Suckevicz  <guito.linux@gmail.com>
+
+	getlogin-tests: avoid false failure under sudo/ssh etc.
+	* modules/getlogin-tests (configure.ac): Check for ttyname().
+	* tests/test-getlogin.c (main): Don't depend on environment variables
+	to correlate with getlogin(), since sudo and ssh etc. can tamper
+	with the LOGNAME and USER env vars.  Instead lookup the name from
+	the uid associated with the stdin tty.
+
 2014-05-11  Paul Eggert  <eggert@cs.ucla.edu>
 
 	mbsstr, quotearg, xstrtol: pacify IRIX 6.5 cc
--- a/modules/getlogin-tests	Sun May 11 00:36:37 2014 -0700
+++ b/modules/getlogin-tests	Wed May 14 22:06:24 2014 +0100
@@ -6,6 +6,7 @@
 Depends-on:
 
 configure.ac:
+AC_CHECK_FUNCS_ONCE([ttyname])
 
 Makefile.am:
 TESTS += test-getlogin
--- a/tests/test-getlogin.c	Sun May 11 00:36:37 2014 -0700
+++ b/tests/test-getlogin.c	Wed May 14 22:06:24 2014 +0100
@@ -27,6 +27,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
+#include <pwd.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
 
 #include "macros.h"
 
@@ -62,11 +67,32 @@
 #if !((defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__)
   /* Unix platform */
   {
-    const char *name = getenv ("LOGNAME");
-    if (name == NULL || name[0] == '\0')
-      name = getenv ("USER");
-    if (name != NULL && name[0] != '\0')
-      ASSERT (strcmp (buf, name) == 0);
+# if HAVE_TTYNAME
+    const char *tty;
+    struct stat stat_buf;
+    struct passwd *pwd;
+
+    tty = ttyname (STDIN_FILENO);
+    if (tty == NULL)
+      {
+         ASSERT (errno == ENOTTY);
+
+         fprintf (stderr, "Skipping test: stdin is not a tty.\n");
+         return 77;
+      }
+
+    ASSERT (stat (tty, &stat_buf) == 0);
+
+    pwd = getpwuid (stat_buf.st_uid);
+    if (! pwd)
+      {
+         fprintf (stderr, "Skipping test: no name found for uid %d\n",
+                  stat_buf.st_uid);
+         return 77;
+      }
+
+    ASSERT (strcmp (pwd->pw_name, buf) == 0);
+# endif
   }
 #endif
 #if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__