2010/7/16 Dan Nelson <[email protected]>: > In the last episode (Jul 16), Ashish SHUKLA said: >> Dan Nelson writes: >> > In the last episode (Jul 15), Jens Rehsack said: >> >> Hi all, >> >> >> >> I detected an issue with getpwent on my FreeBSD test box: >> >> >> >> perl -MData::Dumper -e 'my @e = getpwent(); print Dumper(\...@e); >> >> endpwent(); @e = getpwent(); print Dumper(\...@e); endpwent(); @e = >> >> getpwent(); print Dumper(\...@e); endpwent();' >> >> $VAR1 = [ 'root', '', 0, 0, 0, '', 'Charlie &', '/root', '/bin/csh', 0 ]; >> >> $VAR1 = [ 'toor', '*', 0, 0, 0, '', 'Bourne-again Superuser', '/root', >> >> '', 0 ]; >> >> $VAR1 = [ 'daemon', '*', 1, 1, 0, '', 'Owner of many system processes', >> >> '/root', '/usr/sbin/nologin', 0 ]; >> >> >> >> I'm using FreeBSD waldorf.muppets.liwing.de 7.3-PRERELEASE FreeBSD >> >> 7.3-PRERELEASE #0: Fri Mar 12 11:31:18 UTC 2010 >> >> [email protected]:/usr/obj/usr/src/sys/WALDORF amd64 >> >> > The above output looks perfect, and should match the top three lines in >> > /your etc/passwd files. >> >> Well, OP is also invoking 'endpwent()' after every 'getpwent()' invocation >> which according to GNU/Linux's glibc and NetBSD's libc (as OP mentioned) >> should rewind the position in passwd database to the beginning. > > Ah. I missed the endpwent calls.
Was difficult for me to format the single liner ;) >> To me it definitely looks like a bug in FreeBSD's getpw*() family of >> functions. >> >> As tested using sysutils/lsof, in the following program in FreeBSD, the >> descriptor corresponding to '/etc/pwd.db' is closed on endpwent(3) but >> position in database is never rewinded as shown in the output. > > It looks like the *pwent functions keep an internal counter that endpwent > doesn't reset. Could you please take a look to my other mail (getgrent related) - there seems another bug ... > Try the following patch: Can I do this without a full world rebuild? (I do not develop in FBSD actively). Otherwise I recommend (the test case was in OP) that someone with a separate test box tries it out and commit it etc. I had to develop a workaround for all other boxes anyway. Thank you very much, Jens > Index: gen/getpwent.c > =================================================================== > --- gen/getpwent.c (revision 210157) > +++ gen/getpwent.c (working copy) > @@ -794,6 +794,7 @@ files_setpwent(void *retval, void *mdata, va_list > (void)st->db->close(st->db); > st->db = NULL; > } > + st->keynum = 0; > break; > default: > break; > > > -- > Dan Nelson > [email protected] > _______________________________________________ [email protected] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[email protected]"
