tech-userlevel archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: mail.local NSS awareness
In article <1ig71rb.10m13b1agedd5M%manu%netbsd.org@localhost>,
Emmanuel Dreyfus <manu%netbsd.org@localhost> wrote:
>Manuel Bouyer <bouyer%antioche.eu.org@localhost> wrote:
>
>> A better patch may be to use getpwnam_r(), which explicitely
>> "return 0 on success or entry not found, and non-zero on failure".
>
>Something like this, then?
>
>diff -U 4 -r1.23 mail.local.c
>--- mail.local.c 27 Sep 2006 17:15:20 -0000 1.23
>+++ mail.local.c 30 Apr 2008 02:53:27 -0000
>@@ -56,8 +56,9 @@
> #include <string.h>
> #include <syslog.h>
> #include <time.h>
> #include <unistd.h>
>+#include <sysexits.h>
>
> #include "pathnames.h"
>
> #define FATAL 1
>@@ -180,21 +181,33 @@
> char *name;
> int lockfile;
> {
> struct stat sb;
>- struct passwd *pw;
>+ struct passwd pwres, *pw;
>+ char pwbuf[1024];
> int created, mbfd, nr, nw, off, rval=0, lfd=-1;
> char biffmsg[100], buf[8*1024], path[MAXPATHLEN],
>lpath[MAXPATHLEN];
> off_t curoff;
>
> /*
> * Disallow delivery to unknown names -- special mailboxes can
>be
> * handled in the sendmail aliases file.
> */
>- if (!(pw = getpwnam(name))) {
>- err(NOTFATAL, "unknown name: %s", name);
>- return(1);
>+ if ((getpwnam_r(name, &pwres, pwbuf, sizeof(pwbuf), &pw)) != 0)
>{
>+ switch (errno) {
>+ case EAGAIN:
>+ case ETIMEDOUT:
>+ err(EX_TEMPFAIL, "unknown name: %s", name);
>+ break;
>+ default:
>+ err(EX_UNAVAILABLE, "unknown name: %s", name);
>+ break;
>+ }
>+ /* NOTREACHED */
>+ return(1);
> }
>+ if (pw == NULL)
>+ err(EX_OK, "unknown name: %s", name);
Shouldn't the last err be errx? Also can't we avoid using default: and
enumerate the possible errnos?
christos
Home |
Main Index |
Thread Index |
Old Index