[Raw Msg Headers][Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: hold messages for unknown users

Do you think it may be worth encapsulating getpw*() into some zgetpw*()
and at the very least keep all black magic in one place? Otherwise, it
happens that mailbox and router have different idea of the user existence.


On 16-Jan-01 at 17:32, Matti Aarnio (mea@nic.funet.fi) wrote:
> On Mon, Dec 04, 2000 at 10:16:32PM +0300, Eugene Crosser wrote:
> > The problem was not *exactly* what I expected.
> > My custom getpwnam() returns NULL and errno==0 if there is no such user.
> > I think that errno==0 may very well be indication of "user does not
> > exist" condition in "real" unices as well.
>   Actually my non-custom Solaris 2.6 getpwnam() doing some door_xxx() calls
>   will do exactly same errno returning - but seems to be sensitive on
>   incoming errno value as well!

I think this is semi-standard behavior: if library function succeeds,
don't touch errno, otherwise set it appropriately.  So, the most
reasonable thing seems to be:

	if (pw == NULL) {
	  if (errno == 0 || errno == ENOENT || errno == ENVAL) {
	    /* no user */;
	  } else {
	    /* password/NIS/PAM/LDAP/whatever failure */;

>   The  run_homedir()  function at the router of course didn't accept
>   errno == 0   as "all clear, no user" indication :-/
> > My observation on various versions of Solaris show this: depending on
> > whether MT-safe or non-MT-safe versions of getpwnam[_r]() are used, you
> > can get for a non-existing user EINVAL or EBADF (sic!).  "Common sense"
> > tells me that ENOENT and zero might be used to indicate "no error, user
> > does not exist" condition on other systems.
> > 
> > Of course, all of this is pure black magic...
>   If you look into Single UNIX Specifications (and POSIX work), you
>   will see that they won't define errnos all that specific either!
> > Eugene
> -- 
> /Matti Aarnio     <mea@nic.funet.fi>