SMTP-Client: fix trigger when to send bounce messages
authorWilfried Goesgens <dothebart@citadel.org>
Mon, 30 Jul 2012 20:35:53 +0000 (22:35 +0200)
committerWilfried Goesgens <dothebart@citadel.org>
Mon, 30 Jul 2012 20:35:53 +0000 (22:35 +0200)
  - our trigger to evaluate whether to bounce a message used to be whether its still active. Instead that it has to be whether it was active and isn't active anymore.

citadel/modules/smtp/serv_smtpeventclient.c
citadel/modules/smtp/serv_smtpqueue.c
citadel/modules/smtp/smtpqueue.h

index 548f0b69aff395de3264254f002559db457febed..e85dfe411f1f96c2a90b6c4cd1cb66faf2dcc043 100644 (file)
@@ -153,9 +153,10 @@ eNextState FinalizeMessageSend_DB(AsyncIO *IO)
 
        Msg->IDestructQueItem = DecreaseQReference(Msg->MyQItem);
 
-       Msg->nRemain = CountActiveQueueEntries(Msg->MyQItem);
+       Msg->nRemain = CountActiveQueueEntries(Msg->MyQItem, 0);
 
        if (Msg->MyQEntry->Active && 
+           !Msg->MyQEntry->StillActive &&
            CheckQEntryIsBounce(Msg->MyQEntry))
        {
                /* are we casue for a bounce mail? */
index 3c4c2cb3e5c7b53d121c676e8d36fd79835c934f..a9ad37518659a5ec3143d350e847f993bc3b1d17 100644 (file)
@@ -246,7 +246,7 @@ int CheckQEntryIsBounce(MailQEntry *ThisItem)
                return 0;
 }      
 
-int CountActiveQueueEntries(OneQueItem *MyQItem)
+int CountActiveQueueEntries(OneQueItem *MyQItem, int before)
 {
        HashPos  *It;
        long len;
@@ -258,15 +258,20 @@ int CountActiveQueueEntries(OneQueItem *MyQItem)
        It = GetNewHashPos(MyQItem->MailQEntries, 0);
        while (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))
        {
+               int Active;
                MailQEntry *ThisItem = vQE;
 
                if (CheckQEntryActive(ThisItem))
                {
                        ActiveDeliveries++;
-                       ThisItem->Active = 1;
+                       Active = 1;
                }
                else
-                       ThisItem->Active = 0;
+                       Active = 0;
+               if (before)
+                       ThisItem->Active = Active;
+               else
+                       ThisItem->StillActive = Active;
        }
        DeleteHashPos(&It);
        return ActiveDeliveries;
@@ -902,7 +907,7 @@ void smtp_do_procmsg(long msgnum, void *userdata) {
        DeleteHashPos(&It);
 
        MyQItem->NotYetShutdownDeliveries = 
-       MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem);
+               MyQItem->ActiveDeliveries = CountActiveQueueEntries(MyQItem, 1);
 
        /* failsafe against overload: 
         * will we exceed the limit set? 
index 322e45efd5eefd465ef052361f7f5ed97ca66535..8efe13210834fa6afb59af300ccac9484eab8739 100644 (file)
@@ -40,6 +40,7 @@ typedef struct _mailq_entry {
 
        int n;
        int Active;
+       int StillActive;
 }MailQEntry;
 
 typedef struct queueitem {
@@ -76,7 +77,7 @@ int     DecreaseQReference(OneQueItem *MyQItem);
 void DecreaseShutdownDeliveries(OneQueItem *MyQItem);
 int GetShutdownDeliveries(OneQueItem *MyQItem);
 void    RemoveQItem(OneQueItem *MyQItem);
-int     CountActiveQueueEntries(OneQueItem *MyQItem);
+int     CountActiveQueueEntries(OneQueItem *MyQItem, int before);
 StrBuf *SerializeQueueItem(OneQueItem *MyQItem);
 void    smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt);