remove classic smtp client. we're over this.
[citadel.git] / citadel / modules / smtp / serv_smtpeventclient.c
index 15a55e79960758b4237ccdbf1b209c9dc6fab30b..22c18628a455b694d210e43299b016c2a745085d 100644 (file)
@@ -90,7 +90,6 @@
 #include "smtpqueue.h"
 #include "smtp_clienthandlers.h"
 
-#ifdef EXPERIMENTAL_SMTP_EVENT_CLIENT
 const unsigned short DefaultMXPort = 25;
 void DeleteSmtpOutMsg(void *v)
 {
@@ -99,8 +98,10 @@ void DeleteSmtpOutMsg(void *v)
        ares_free_data(Msg->AllMX);
        if (Msg->HostLookup.VParsedDNSReply != NULL)
                Msg->HostLookup.DNSReplyFree(Msg->HostLookup.VParsedDNSReply);
+       FreeURL(&Msg->Relay);
        FreeStrBuf(&Msg->msgtext);
        FreeAsyncIOContents(&Msg->IO);
+       memset (Msg, 0, sizeof(SmtpOutMsg)); /* just to be shure... */
        free(Msg);
 }
 
@@ -123,7 +124,7 @@ eNextState get_one_mx_host_ip(AsyncIO *IO);
  ******************************************************************************/
 void FinalizeMessageSend(SmtpOutMsg *Msg)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        
        if (DecreaseQReference(Msg->MyQItem)) 
        {
@@ -158,6 +159,8 @@ void FinalizeMessageSend(SmtpOutMsg *Msg)
 
                RemoveQItem(Msg->MyQItem);
        }
+
+       RemoveContext(Msg->IO.CitContext);
        DeleteSmtpOutMsg(Msg);
 }
 
@@ -168,8 +171,11 @@ eNextState FailOneAttempt(AsyncIO *IO)
         * possible ways here: 
         * - connection timeout 
         * - 
-        */     
-       SendMsg->pCurrRelay = SendMsg->pCurrRelay->Next;
+        */
+       StopClientWatchers(IO);
+
+       if (SendMsg->pCurrRelay != NULL)
+               SendMsg->pCurrRelay = SendMsg->pCurrRelay->Next;
 
        if (SendMsg->pCurrRelay == NULL)
                return eAbort;
@@ -204,14 +210,14 @@ void SetConnectStatus(AsyncIO *IO)
                  sizeof(buf));
 
        if (SendMsg->mx_host == NULL)
-               SendMsg->mx_host = "<no name>";
+               SendMsg->mx_host = "<no MX-Record>";
 
-       CtdlLogPrintf(CTDL_DEBUG, 
-                     "SMTP client[%ld]: connecting to %s [%s]:%d ...\n", 
-                     SendMsg->n, 
-                     SendMsg->mx_host, 
-                     buf,
-                     SendMsg->IO.ConnectMe->Port);
+       syslog(LOG_DEBUG,
+              "SMTP client[%ld]: connecting to %s [%s]:%d ...\n", 
+              SendMsg->n, 
+              SendMsg->mx_host, 
+              buf,
+              SendMsg->IO.ConnectMe->Port);
 
        SendMsg->MyQEntry->Status = 5; 
        StrBufPrintf(SendMsg->MyQEntry->StatusMessage, 
@@ -219,6 +225,7 @@ void SetConnectStatus(AsyncIO *IO)
                     SendMsg->mx_host,
                     buf,
                     SendMsg->IO.ConnectMe->Port);
+       SendMsg->IO.NextState = eConnect;
 }
 
 /*****************************************************************************
@@ -228,7 +235,7 @@ eNextState mx_connect_ip(AsyncIO *IO)
 {
        SmtpOutMsg *SendMsg = IO->Data;
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        
        IO->ConnectMe = SendMsg->pCurrRelay;
        /*  Bypass the ns lookup result like this: IO->Addr.sin_addr.s_addr = inet_addr("127.0.0.1"); */
@@ -272,6 +279,7 @@ eNextState get_one_mx_host_ip_done(AsyncIO *IO)
                        addr->sin_port   = htons(DefaultMXPort);
                        
                }
+               SendMsg->mx_host = SendMsg->pCurrRelay->Host;
                return mx_connect_ip(IO);
        }
        else // TODO: here we need to find out whether there are more mx'es, backup relay, and so on
@@ -290,13 +298,14 @@ eNextState get_one_mx_host_ip(AsyncIO *IO)
 
        InitC_ares_dns(IO);
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
 
-       CtdlLogPrintf(CTDL_DEBUG, 
-                     "SMTP client[%ld]: looking up %s : %d ...\n", 
-                     SendMsg->n, 
-                     SendMsg->pCurrRelay->Host, 
-                     SendMsg->pCurrRelay->Port);
+       syslog(LOG_DEBUG, 
+              "SMTP client[%ld]: looking up %s-Record %s : %d ...\n", 
+              SendMsg->n, 
+              (SendMsg->pCurrRelay->IPv6)? "aaaa": "a",
+              SendMsg->pCurrRelay->Host, 
+              SendMsg->pCurrRelay->Port);
 
        if (!QueueQuery((SendMsg->pCurrRelay->IPv6)? ns_t_aaaa : ns_t_a, 
                        SendMsg->pCurrRelay->Host, 
@@ -307,8 +316,10 @@ eNextState get_one_mx_host_ip(AsyncIO *IO)
                SendMsg->MyQEntry->Status = 5;
                StrBufPrintf(SendMsg->MyQEntry->StatusMessage, 
                             "No MX hosts found for <%s>", SendMsg->node);
+               SendMsg->IO.NextState = eTerminateConnection;
                return IO->NextState;
        }
+       IO->NextState = eReadDNSReply;
        return IO->NextState;
 }
 
@@ -323,7 +334,7 @@ eNextState smtp_resolve_mx_record_done(AsyncIO *IO)
 
        QueryCbDone(IO);
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        pp = &SendMsg->Relay;
        while ((pp != NULL) && (*pp != NULL) && ((*pp)->Next != NULL))
                pp = &(*pp)->Next;
@@ -380,7 +391,7 @@ eNextState resolve_mx_records(AsyncIO *IO)
 {
        SmtpOutMsg * SendMsg = IO->Data;
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        /* start resolving MX records here. */
        if (!QueueQuery(ns_t_mx, 
                        SendMsg->node, 
@@ -393,7 +404,8 @@ eNextState resolve_mx_records(AsyncIO *IO)
                             "No MX hosts found for <%s>", SendMsg->node);
                return IO->NextState;
        }
-       return eAbort;
+       SendMsg->IO.NextState = eReadDNSReply;
+       return IO->NextState;
 }
 
 
@@ -443,16 +455,17 @@ void smtp_try_one_queue_entry(OneQueItem *MyQItem,
 {
        SmtpOutMsg *SendMsg;
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
 
        SendMsg = new_smtp_outmsg(MyQItem, MyQEntry, MsgCount);
        if (KeepMsgText) SendMsg->msgtext = MsgText;
        else             SendMsg->msgtext = NewStrBufDup(MsgText);
        
        if (smtp_resolve_recipients(SendMsg)) {
-
-               
-
+               CitContext *SubC;
+               SubC = CloneContext (CC);
+               SubC->session_specific_data = (char*) SendMsg;
+               SendMsg->IO.CitContext = SubC;
 
                if (SendMsg->pCurrRelay == NULL)
                        QueueEventContext(&SendMsg->IO,
@@ -491,8 +504,10 @@ void smtp_try_one_queue_entry(OneQueItem *MyQItem,
 
 void SMTPSetTimeout(eNextState NextTCPState, SmtpOutMsg *pMsg)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
-       double Timeout;
+       double Timeout = 0.0;
+
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
+
        switch (NextTCPState) {
        case eSendReply:
        case eSendMore:
@@ -512,6 +527,12 @@ void SMTPSetTimeout(eNextState NextTCPState, SmtpOutMsg *pMsg)
                        Timeout += StrLength(pMsg->msgtext) / 1024;
                }
                break;
+       case eSendDNSQuery:
+       case eReadDNSReply:
+       case eDBQuery:
+       case eReadMore:
+       case eReadPayload:
+       case eConnect:
        case eTerminateConnection:
        case eAbort:
                return;
@@ -520,7 +541,7 @@ void SMTPSetTimeout(eNextState NextTCPState, SmtpOutMsg *pMsg)
 }
 eNextState SMTP_C_DispatchReadDone(AsyncIO *IO)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        SmtpOutMsg *pMsg = IO->Data;
        eNextState rc;
 
@@ -531,7 +552,7 @@ eNextState SMTP_C_DispatchReadDone(AsyncIO *IO)
 }
 eNextState SMTP_C_DispatchWriteDone(AsyncIO *IO)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        SmtpOutMsg *pMsg = IO->Data;
        eNextState rc;
 
@@ -548,7 +569,7 @@ eNextState SMTP_C_Terminate(AsyncIO *IO)
 {
        SmtpOutMsg *pMsg = IO->Data;
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        FinalizeMessageSend(pMsg);
        return eAbort;
 }
@@ -556,7 +577,7 @@ eNextState SMTP_C_Timeout(AsyncIO *IO)
 {
        SmtpOutMsg *pMsg = IO->Data;
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        StrBufPlain(IO->ErrMsg, CKEY(ReadErrors[pMsg->State]));
        return FailOneAttempt(IO);
 }
@@ -564,13 +585,13 @@ eNextState SMTP_C_ConnFail(AsyncIO *IO)
 {
        SmtpOutMsg *pMsg = IO->Data;
 
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        StrBufPlain(IO->ErrMsg, CKEY(ReadErrors[pMsg->State]));
        return FailOneAttempt(IO);
 }
 eNextState SMTP_C_Shutdown(AsyncIO *IO)
 {
-       CtdlLogPrintf(CTDL_DEBUG, "SMTP: %s\n", __FUNCTION__);
+       syslog(LOG_DEBUG, "SMTP: %s\n", __FUNCTION__);
        SmtpOutMsg *pMsg = IO->Data;
 
        pMsg->MyQEntry->Status = 3;
@@ -611,7 +632,6 @@ eReadState SMTP_C_ReadServerStatus(AsyncIO *IO)
        return Finished;
 }
 
-#endif
 CTDL_MODULE_INIT(smtp_eventclient)
 {
        return "smtpeventclient";