+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
#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"
#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__