Hi Pádraig, I completely OK with it, my doubt was with the assert calls! Thank you for the help! ;D
Thanks, Guilherme Almeida. 2014-05-14 18:16 GMT-03:00 Pádraig Brady <p...@draigbrady.com>: > On 05/14/2014 03:03 PM, Guilherme de Almeida Suckevicz wrote: > > Hi Pádraig, > > > > Thanks for the help! So, Adjusting just the part on non windows > platforms, I arrive here. > > I'm just with doubt in the ASSERT calls. > > > > Please, if you can, take a look: > > > > diff --git a/tests/test-getlogin.c b/tests/test-getlogin.c > > index 197aed8..0a46267 100644 > > --- a/tests/test-getlogin.c > > +++ b/tests/test-getlogin.c > > @@ -27,6 +27,11 @@ SIGNATURE_CHECK (getlogin, char *, (void)); > > #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,29 @@ main (void) > > #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); > > + const char *tty; > > + struct stat stat_buf; > > + struct passwd *pwd; > > + > > + tty = ttyname (STDIN_FILENO); > > + if (tty == NULL) > > + { > > + if (errno == ENOTTY) > > + { > > + fprintf (stderr, "Skipping test: stdin is not a tty.\n"); > > + return 77; > > + } > > + /* Some other error, call assert. */ > > + ASSERT (0); > > + } > > + > > + if (stat (tty, &stat_buf) < 0) > > + ASSERT (0); > > + > > + pwd = getpwuid (stat_buf.st_uid); > > + ASSERT (! (pwd == NULL)); > > + > > + ASSERT (strcmp (pwd->pw_name, buf) == 0); > > } > > #endif > > #if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ > > > > > > Sorry for any mistake! > > > > Thank you very much! > > Guilherme Almeida. > > > > > > 2014-05-13 18:47 GMT-03:00 Pádraig Brady <p...@draigbrady.com <mailto: > p...@draigbrady.com>>: > > > > On 05/13/2014 08:39 PM, Guilherme de Almeida Suckevicz wrote: > > > Hi Pádraig, > > > > > > Thanks for the answer! I will work on a patch for that. > > > > > > I think the better way to fix this is check the getlogin(3) > against the > > > owner of the controlling terminal, this is, using the ttyname(3), > stat(2) > > > and the field pw_name of getpwuid(3). > > > > > > Is it right!? > > > > Well first of all the test is really only checking the windows > replacement function, > > so I wouldn't jump through many hoops to correlate the actual > getlogin() independently. > > Anyway let's see what combos of env variables we have... > > > > tp1:~$ python -c "import os, pwd; print os.environ.get('USER'), > os.environ.get('LOGNAME'), os.environ.get('SUDO_USER'), os.getlogin(), > pwd.getpwuid(os.stat(os.ttyname(0)).st_uid).pw_name" > > padraig padraig None padraig padraig > > tp1:~$ sudo !! > > root root padraig padraig padraig > > > > tp1:~$ ssh root@tp2 > > [root@tp2 ~]# su - padraig > > tp2:~$ python -c "import os, pwd; print os.environ.get('USER'), > os.environ.get('LOGNAME'), os.environ.get('SUDO_USER'), os.getlogin(), > pwd.getpwuid(os.stat(os.ttyname(0)).st_uid).pw_name" > > padraig padraig None root root > > tp2:~$ sudo !! > > root root padraig root root > > > > So we see the last 2 (your method and getlogin()) correlate for each > case here. > > The problematic cases are when LOGNAME/USER are different from > getlogin(), > > and I don't see any other combo of env variables to identify those > cases, > > so it seems your method is best for direct correlation. > > > > Now on non windows systems we're not actually replacing any code, > > so the simple solution would be on non windows to not care > > about the returned value at all. > > > > I.E. I'd just do the following to remove the problematic code > > which is invalid in all the above caes. If we actually implement > > getlogin() on non windows we can jump though hoops then to > > do the correlation. > > > > diff --git a/tests/test-getlogin.c b/tests/test-getlogin.c > > index 197aed8..7b19f8c 100644 > > --- a/tests/test-getlogin.c > > +++ b/tests/test-getlogin.c > > @@ -59,16 +59,6 @@ main (void) > > } > > > > /* Compare against the value from the environment. */ > > -#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); > > - } > > -#endif > > #if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__ > > /* Native Windows platform. > > Note: This test would fail on Cygwin in an ssh session, > because sshd > > > > thanks, > > Pádraig. > > > > > > So you went the route of adding rather than deleting code. Fair enough. > I tweaked a bit in the attached which I;ll apply soon if you're OK with it. > It passes these here: > > ./gnulib-tool --create-testdir --with-tests --test getlogin > sudo !! > > thanks, > Pádraig. > >