]> git.ipfire.org Git - people/ms/dma.git/commitdiff
deliver_local: use do_timeout and blocking locking
authorSimon Schubert <2@0x2c.org>
Wed, 30 Jun 2010 22:48:05 +0000 (00:48 +0200)
committerSimon Schubert <2@0x2c.org>
Wed, 30 Jun 2010 22:48:05 +0000 (00:48 +0200)
dma.c
local.c

diff --git a/dma.c b/dma.c
index 4685e0968752536ab495756e21636803fec02ba5..83491d70bb7cb6e367739b8b8e0f6093b090ec76 100644 (file)
--- a/dma.c
+++ b/dma.c
@@ -268,16 +268,11 @@ static void
 deliver(struct qitem *it)
 {
        int error;
-       unsigned int backoff;
+       unsigned int backoff = MIN_RETRY;
        const char *errmsg = "unknown bounce reason";
        struct timeval now;
        struct stat st;
 
-       if (it->remote)
-               backoff = MIN_RETRY;
-       else
-               backoff = 1;    /* one second for local deliveries */
-
 retry:
        syslog(LOG_INFO, "trying delivery");
 
diff --git a/local.c b/local.c
index 9ce49284f4aeacbb88a62dd0303e24c128961dd5..42250e2ff9bb91822a39e19ef065b3742db72243 100644 (file)
--- a/local.c
+++ b/local.c
@@ -29,12 +29,23 @@ deliver_local(struct qitem *it, const char **errmsg)
                return (1);
        }
 
+       /* wait for a maximum of 100s to get the lock to the file */
+       do_timeout(100, 0);
+
        /* mailx removes users mailspool file if empty, so open with O_CREAT */
-       mbox = open_locked(fn, O_WRONLY|O_APPEND|O_NONBLOCK|O_CREAT, 0660);
+       mbox = open_locked(fn, O_WRONLY|O_APPEND|O_CREAT, 0660);
        if (mbox < 0) {
-               syslog(LOG_NOTICE, "local delivery deferred: can not open `%s': %m", fn);
+               int e = errno;
+
+               do_timeout(0, 0);
+               if (e == EINTR)
+                       syslog(LOG_NOTICE, "local delivery deferred: can not lock `%s'", fn);
+               else
+                       syslog(LOG_NOTICE, "local delivery deferred: can not open `%s': %m", fn);
                return (1);
        }
+       do_timeout(0, 0);
+
        mboxlen = lseek(mbox, 0, SEEK_END);
 
        /* New mails start with \nFrom ...., unless we're at the beginning of the mbox */
@@ -48,13 +59,13 @@ deliver_local(struct qitem *it, const char **errmsg)
 
        if (fseek(it->mailf, 0, SEEK_SET) != 0) {
                syslog(LOG_NOTICE, "local delivery deferred: can not seek: %m");
-               return (1);
+               goto out;
        }
 
        error = snprintf(line, sizeof(line), "%sFrom %s\t%s", newline, sender, ctime(&now));
        if (error < 0 || (size_t)error >= sizeof(line)) {
                syslog(LOG_NOTICE, "local delivery deferred: can not write header: %m");
-               return (1);
+               goto out;
        }
        if (write(mbox, line, error) != error)
                goto wrerror;
@@ -93,6 +104,7 @@ wrerror:
 chop:
        if (ftruncate(mbox, mboxlen) != 0)
                syslog(LOG_WARNING, "error recovering mbox `%s': %m", fn);
+out:
        close(mbox);
        return (error);
 }