[PATCH] Fix getlogin() to check only stdin to get a valid tty

Jordi Sanfeliu via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Hello,

In my hobby OS [1] which uses Newlib C as its libc, I noticed that the 
GNU command 'logname' does output nothing when it is redirected or pipe'd.

The current getlogin() implementation [2] forces the three primary file 
descriptors (stdin, stdout and stderr) to be a valid tty before checking 
the utmp file, otherwise it returns NULL. This makes impossible to 
redirect (to a file or to a pipe), the output of a program that is using 
this function because one of its file descriptors won't be a tty.

See:

# cat test.c
#include <stdio.h>

int main(void)
{
	char *user;

	if(user = getlogin()) {
		printf("%s\n", user);
	}

	return 0;
}

# ./test
root
# ./test > xx
# cat xx
# ./test | cat
#

To fix this, I thought that only checking if stdin is a valid tty would 
be enough.

Does this sound reasonable to you?
Thanks.



diff --git a/newlib/libc/unix/getlogin.c b/newlib/libc/unix/getlogin.c
index da4f47a95..e646bcb08 100644
--- a/newlib/libc/unix/getlogin.c
+++ b/newlib/libc/unix/getlogin.c
@@ -16,9 +16,7 @@ getlogin ()
    extern char *ttyname ();
    char *tty;

-  if (((tty = ttyname (0)) == 0)
-      || ((tty = ttyname (1)) == 0)
-      || ((tty = ttyname (2)) == 0))
+  if ((tty = ttyname (0)) == 0)
      return 0;

    if ((utmp_fd = open (UTMP_FILE, O_RDONLY)) == -1)


1. https://www.fiwix.org
2. 
https://sourceware.org/git/?p=newlib-cygwin.git;a=blob_plain;f=newlib/libc/unix/getlogin.c;hb=HEAD

-- 
Jordi Sanfeliu
FIBRANET Network Services Provider
https://www.fibranet.cat
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.