Goal: Provide more info when chown_tty() phase of login fails (see #332198). Related: #332198 (helps to debug) Status wrt upstream: Not forwarded (dunno if there's any point in this). This patch increases verbosity of is_my_tty() routine which is called from chown_tty() which in turn is part of login sequence. Submitter of the bug #332198 sometimes gets telnet session refused, but message in syslog is not at all helpful: > ... login[453]: unable to determine TTY name, got /dev/pts/1 and in fact it's misleading, because tty name is detected OK, it's is_my_tty() which is failing for a reason yet unknown (I suspect corruption of utmp file). Index: shadow-4.1.0/libmisc/chowntty.c =================================================================== --- shadow-4.1.0.orig/libmisc/chowntty.c +++ shadow-4.1.0/libmisc/chowntty.c @@ -40,6 +40,7 @@ #include "defines.h" #include #include "getdef.h" +#include /* * is_my_tty -- determine if "tty" is the same as TTY stdin is using */ @@ -47,12 +48,31 @@ { struct stat by_name, by_fd; - if (stat (tty, &by_name) || fstat (0, &by_fd)) + if (stat (tty, &by_name)) { + /* Can use neither strerror() nor "%m" sequence -- first + * is locale-dependent (while SYSLOG isn't) and for second + * the SYSLOG macro isn't errno-transparent. --xrgtn */ + int e = errno; + SYSLOG ((LOG_WARN, "can't stat(`%s'): errno %i\n", tty, e)); return 0; + } - if (by_name.st_rdev != by_fd.st_rdev) + if (fstat (0, &by_fd)) { + int e = errno; + SYSLOG ((LOG_WARN, "can't fstat(stdin): errno %i\n", e)); return 0; - else + } + + if (by_name.st_rdev != by_fd.st_rdev) { + SYSLOG ((LOG_WARN, + "`%s'.st_rdev(%u,%u) != stdin.st_rdev(%u,%u)\n", + tty, + /* XXX: dev_t is 64bit, gnu_dev_mXXor are used + * which are GNU extn */ + major(by_name.st_rdev), minor(by_name.st_rdev), + major(by_fd.st_rdev), minor(by_fd.st_rdev))); + return 0; + } else return 1; }