X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fsmtp%2Fserv_smtpqueue.c;h=6b46164c611e399605d040268bc0f6116c26d97a;hb=05d5849d2ef0d9a685899f53728e60b387af107a;hp=26c7e555dd47a7f141aae25da3fffb1ab236f4c4;hpb=ece6bf1eb58266623578ed8017895ffe6f458c65;p=citadel.git diff --git a/citadel/modules/smtp/serv_smtpqueue.c b/citadel/modules/smtp/serv_smtpqueue.c index 26c7e555d..6b46164c6 100644 --- a/citadel/modules/smtp/serv_smtpqueue.c +++ b/citadel/modules/smtp/serv_smtpqueue.c @@ -88,20 +88,20 @@ #include "smtpqueue.h" #include "event_client.h" -HashList *QItemHandlers = NULL; citthread_mutex_t ActiveQItemsLock; -HashList *ActiveQItems = NULL; +HashList *ActiveQItems = NULL; +HashList *QItemHandlers = NULL; -int MsgCount = 0; -int run_queue_now = 0; /* Set to 1 to ignore SMTP send retry times */ +int MsgCount = 0; +int run_queue_now = 0; /* Set to 1 to ignore SMTP send retry times */ -void smtp_try(OneQueItem *MyQItem, - MailQEntry *MyQEntry, - StrBuf *MsgText, - int KeepMsgText, /* KeepMsgText allows us to use MsgText as ours. */ - int MsgCount, - ParsedURL *RelayUrls); +void smtp_try_one_queue_entry(OneQueItem *MyQItem, + MailQEntry *MyQEntry, + StrBuf *MsgText, + int KeepMsgText, /* KeepMsgText allows us to use MsgText as ours. */ + int MsgCount, + ParsedURL *RelayUrls); void smtp_evq_cleanup(void) @@ -117,10 +117,8 @@ int DecreaseQReference(OneQueItem *MyQItem) { int IDestructQueItem; - citthread_mutex_lock(&ActiveQItemsLock); MyQItem->ActiveDeliveries--; IDestructQueItem = MyQItem->ActiveDeliveries == 0; - citthread_mutex_unlock(&ActiveQItemsLock); return IDestructQueItem; } @@ -138,12 +136,6 @@ void RemoveQItem(OneQueItem *MyQItem) DeleteHashPos(&It); } -void FreeURL(ParsedURL** Url) -{ - FreeStrBuf(&(*Url)->URL); - free(*Url); - *Url = NULL; -} void FreeMailQEntry(void *qv) { @@ -213,7 +205,7 @@ OneQueItem *DeserializeQueueItem(StrBuf *RawQItem, long QueMsgID) citthread_mutex_lock(&ActiveQItemsLock); if (GetHash(ActiveQItems, - IKEY(Item->QueMsgID), + IKEY(QueMsgID), &v)) { /* WHOOPS. somebody else is already working on this. */ @@ -416,7 +408,7 @@ StrBuf *smtp_load_msg(OneQueItem *MyQItem, int n) if ((StrLength(SendMsg) > 0) && ChrPtr(SendMsg)[StrLength(SendMsg) - 1] != '\n') { CtdlLogPrintf(CTDL_WARNING, - "SMTP client[%ld]: Possible problem: message did not " + "SMTP client[%d]: Possible problem: message did not " "correctly terminate. (expecting 0x10, got 0x%02x)\n", MsgCount, //yes uncool, but best choice here... ChrPtr(SendMsg)[StrLength(SendMsg) - 1] ); @@ -597,76 +589,6 @@ void smtpq_do_bounce(OneQueItem *MyQItem, StrBuf *OMsgTxt) -int ParseURL(ParsedURL **Url, StrBuf *UrlStr, short DefaultPort) -{ - const char *pch, *pEndHost, *pPort, *pCredEnd, *pUserEnd; - ParsedURL *url = (ParsedURL *)malloc(sizeof(ParsedURL)); - memset(url, 0, sizeof(ParsedURL)); - - url->af = AF_INET; - url->Port = DefaultPort; - /* - * http://username:passvoid@[ipv6]:port/url - */ - url->URL = NewStrBufDup(UrlStr); - url->Host = pch = ChrPtr(url->URL); - url->LocalPart = strchr(pch, '/'); - if (url->LocalPart != NULL) { - if ((*(url->LocalPart + 1) == '/') && - (*(url->LocalPart + 2) == ':')) { /* TODO: find default port for this protocol... */ - url->Host = url->LocalPart + 3; - url->LocalPart = strchr(url->Host, '/'); - } - } - if (url->LocalPart == NULL) { - url->LocalPart = pch + StrLength(url->URL); - } - - pCredEnd = strchr(pch, '@'); - if (pCredEnd >= url->LocalPart) - pCredEnd = NULL; - if (pCredEnd != NULL) - { - url->User = url->Host; - url->Host = pCredEnd + 1; - pUserEnd = strchr(url->User, ':'); - - if (pUserEnd > pCredEnd) - pUserEnd = pCredEnd; - else { - url->Pass = pUserEnd + 1; - } - StrBufPeek(url->URL, pUserEnd, 0, '\0'); - StrBufPeek(url->URL, pCredEnd, 0, '\0'); - } - - pPort = NULL; - if (*url->Host == '[') { - url->Host ++; - pEndHost = strchr(url->Host, ']'); - if (pEndHost == NULL) { - free(url); - return 0; /* invalid syntax, no ipv6 */ - } - if (*(pEndHost + 1) == ':'){ - StrBufPeek(url->URL, pEndHost + 1, 0, '\0'); - pPort = pEndHost + 2; - } - url->af = AF_INET6; - } - else { - pPort = strchr(url->Host, ':'); - if (pPort != NULL) { - StrBufPeek(url->URL, pPort, 0, '\0'); - pPort ++; - } - } - if (pPort != NULL) - url->Port = atol(pPort); - url->IsIP = inet_pton(url->af, url->Host, &url->Addr); - *Url = url; - return 1; -} /* { @@ -769,6 +691,29 @@ void smtp_do_procmsg(long msgnum, void *userdata) { All = NewStrBufPlain(mxbuf, -1); One = NewStrBufPlain(NULL, StrLength(All) + 1); + while ((Pos != StrBufNOTNULL) && ((Pos == NULL) || !IsEmptyStr(Pos))) { + StrBufExtract_NextToken(One, All, &Pos, '|'); + if (!ParseURL(Url, One, 25)) + CtdlLogPrintf(CTDL_DEBUG, "Failed to parse: %s\n", ChrPtr(One)); + else { + ///if (!Url->IsIP)) /// todo dupe me fork ipv6 + Url = &(*Url)->Next; + + } + } + FreeStrBuf(&All); + FreeStrBuf(&One); + } + + Url = &MyQItem->FallBackHost; + nRelays = get_hosts(mxbuf, "fallbackhost"); + if (nRelays > 0) { + StrBuf *All; + StrBuf *One; + const char *Pos = NULL; + All = NewStrBufPlain(mxbuf, -1); + One = NewStrBufPlain(NULL, StrLength(All) + 1); + while ((Pos != StrBufNOTNULL) && ((Pos == NULL) || !IsEmptyStr(Pos))) { StrBufExtract_NextToken(One, All, &Pos, '|'); if (!ParseURL(Url, One, 25)) @@ -793,18 +738,28 @@ void smtp_do_procmsg(long msgnum, void *userdata) { if (MyQItem->ActiveDeliveries > 0) { int n = MsgCount++; + int m = MyQItem->ActiveDeliveries; int i = 1; Msg = smtp_load_msg(MyQItem, n); It = GetNewHashPos(MyQItem->MailQEntries, 0); - while ((i <= MyQItem->ActiveDeliveries) && + while ((i <= m) && (GetNextHashPos(MyQItem->MailQEntries, It, &len, &Key, &vQE))) { MailQEntry *ThisItem = vQE; if (ThisItem->Active == 1) { - int KeepBuffers = (i == MyQItem->ActiveDeliveries); + int KeepBuffers = (i == m); if (i > 1) n = MsgCount++; - CtdlLogPrintf(CTDL_DEBUG, "SMTP Queue: Trying <%s>\n", ChrPtr(ThisItem->Recipient)); - smtp_try(MyQItem, ThisItem, Msg, KeepBuffers, n, RelayUrls); + CtdlLogPrintf(CTDL_DEBUG, + "SMTP Queue: Trying <%s> %d / %d \n", + ChrPtr(ThisItem->Recipient), + i, + m); + smtp_try_one_queue_entry(MyQItem, + ThisItem, + Msg, + KeepBuffers, + n, + RelayUrls); if (KeepBuffers) HaveBuffers = 1; i++; } @@ -942,7 +897,7 @@ CTDL_MODULE_INIT(smtp_queu) #ifdef EXPERIMENTAL_SMTP_EVENT_CLIENT if (!threading) { - ActiveQItems = NewHash(1, Flathash); + ActiveQItems = NewHash(1, lFlathash); citthread_mutex_init(&ActiveQItemsLock, NULL); QItemHandlers = NewHash(0, NULL);