tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

mail.local NSS awareness


mail.local assumes that if getpwnam(3) returns NULL, that means the 
recipient does not exists, and the message shall be dropped. Hence it
returns code EX_OK to the MTA.

This behaviour does not take NSS into account. NSS source others than 
file may fail, and they may fail for a temporary condition. In that 
situation, mail.local should exit with a status code different than
EX_OK, so that the MTA understands that delivery should be retried
at a later time.

As I understand, sendmail expects EX_OK, EX_TEMPFAIL, or EX_UNAVAILABLE,
so I propose the patch included below. I don't know how well that cope
with other MTA, or if there are other errno like EAGAIN and ETIMEDOUT
that should cause EX_TEMPFAIL (temporary failure) instead of EX_UNAVAILABLE
(permanent failure). Opinions?

--- mail.local.c.orig   2008-04-29 10:47:43.000000000 +0200
+++ mail.local.c        2008-04-29 10:55:45.000000000 +0200
@@ -190,9 +190,21 @@
         * 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);
+               switch (errno) {
+               case 0:
+                       err(EX_OK, "unknown name: %s", name);
+                       break;
+               case EAGAIN:
+               case ETIMEDOUT:
+                       err(EX_TEMPFAIL, "unknown name: %s", name);
+                       break;
+               default:
+                       err(EX_UNAVAILABLE, "unknown name: %s", name);
+                       break;
+               }
+               /* NOTREACHED */
        (void)snprintf(path, sizeof path, "%s/%s", _PATH_MAILDIR, name);

Emmanuel Dreyfus

Home | Main Index | Thread Index | Old Index