Original patch pushed, thanks. -- Jeff J. On Wed, Jul 12, 2023 at 1:34 PM Jordi Sanfeliu via Newlib < newlib@sourceware.org> wrote: > 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 > > 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 > >