LOGGING: add name to pop3 logging & message writing
[citadel.git] / citadel / modules / pop3client / serv_pop3client.c
index fa151f6694707e9fbae3c8f9ca883ba957be8c04..433309f38895ed0d9e6877f510ad40848e985d3c 100644 (file)
 
 
 #define POP3C_OK (strncasecmp(ChrPtr(RecvMsg->IO.IOBuf), "+OK", 3) == 0)
+int Pop3ClientID = 0;
+int POP3ClientDebugEnabled = 0;
 
-#define POP3C_DBG_SEND()                                       \
-       syslog(LOG_DEBUG,                                       \
-              "POP3 client[%ld]: > %s\n",                      \
-              RecvMsg->n, ChrPtr(RecvMsg->IO.SendBuf.Buf))
+#define N ((pop3aggr*)IO->Data)->n
 
-#define POP3C_DBG_READ()                               \
-       syslog(LOG_DEBUG,                               \
-              "POP3 client[%ld]: < %s\n",              \
-              RecvMsg->n,                              \
-              ChrPtr(RecvMsg->IO.IOBuf))
+#define DBGLOG(LEVEL) if ((LEVEL != LOG_DEBUG) || (POP3ClientDebugEnabled != 0))
+
+#define EVP3C_syslog(LEVEL, FORMAT, ...)                               \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "IO[%ld]CC[%d][%ld]POP3: " FORMAT,         \
+                            IO->ID, CCID, N, __VA_ARGS__)
+
+#define EVP3CM_syslog(LEVEL, FORMAT)                                   \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "IO[%ld]CC[%d][%ld]POP3: " FORMAT,         \
+                            IO->ID, CCID, N)
+
+#define EVP3CQ_syslog(LEVEL, FORMAT, ...)                              \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "P3Q:" FORMAT,                             \
+                            __VA_ARGS__)
+
+#define EVP3CQM_syslog(LEVEL, FORMAT)                                  \
+       DBGLOG(LEVEL) syslog(LEVEL,                                     \
+                            "P3Q" FORMAT                               \
+               )
+
+#define EVP3CCS_syslog(LEVEL, FORMAT, ...)                             \
+       DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]POP3: " FORMAT,        \
+                            IO->ID, N, __VA_ARGS__)
+
+#define EVP3CCSM_syslog(LEVEL, FORMAT)                                 \
+       DBGLOG(LEVEL) syslog(LEVEL, "IO[%ld][%ld]POP3: " FORMAT,        \
+                            IO->ID, N)
+
+#define POP3C_DBG_SEND()                                               \
+       EVP3C_syslog(LOG_DEBUG,                                         \
+                    "IO[%ld]CC[%d][%ld]POP3: > %s\n",                  \
+                    IO->ID, CCID, N,                                   \
+                    ChrPtr(RecvMsg->IO.SendBuf.Buf))
+
+#define POP3C_DBG_READ()                                               \
+       EVP3C_syslog(LOG_DEBUG,                                         \
+                    "IO[%ld]CC[%d][%ld]POP3: < %s\n",                  \
+                    IO->ID, CCID, N,                                   \
+                    ChrPtr(RecvMsg->IO.IOBuf))
 
 
 struct CitContext pop3_client_CC;
@@ -127,6 +162,8 @@ struct pop3aggr {
        AsyncIO  IO;
 
        long n;
+       double IOStart;
+       long count;
        long RefCount;
        DNSQueryParts HostLookup;
 
@@ -136,6 +173,7 @@ struct pop3aggr {
        StrBuf          *Url;
        StrBuf *pop3user;
        StrBuf *pop3pass;
+       StrBuf *Host;
        StrBuf *RoomName; // TODO: fill me
        int keep;
        time_t interval;
@@ -153,6 +191,7 @@ void DeletePOP3Aggregator(void *vptr)
 //     FreeStrBuf(&ptr->rooms);
        FreeStrBuf(&ptr->pop3user);
        FreeStrBuf(&ptr->pop3pass);
+       FreeStrBuf(&ptr->Host);
        FreeStrBuf(&ptr->RoomName);
        FreeURL(&ptr->IO.ConnectMe);
        FreeStrBuf(&ptr->Url);
@@ -169,14 +208,21 @@ void DeletePOP3Aggregator(void *vptr)
 eNextState FinalizePOP3AggrRun(AsyncIO *IO)
 {
        HashPos  *It;
-       pop3aggr *cptr = (pop3aggr *)IO->Data;
+       pop3aggr *cpptr = (pop3aggr *)IO->Data;
 
-       syslog(LOG_DEBUG, "Terminating Aggregator; bye.\n");
+       EVP3C_syslog(LOG_INFO,
+                    "%s@%s: fetched %ld new of %d messages in %fs. bye.",
+                    ChrPtr(cpptr->pop3user),
+                    ChrPtr(cpptr->Host),
+                    cpptr->count,
+                    GetCount(cpptr->MsgNumbers), 
+                    IO->Now - cpptr->IOStart 
+               );
 
        It = GetNewHashPos(POP3FetchUrls, 0);
        pthread_mutex_lock(&POP3QueueMutex);
        {
-               if (GetHashPosFromKey(POP3FetchUrls, SKEY(cptr->Url), It))
+               if (GetHashPosFromKey(POP3FetchUrls, SKEY(cpptr->Url), It))
                        DeleteEntryFromHash(POP3FetchUrls, It);
        }
        pthread_mutex_unlock(&POP3QueueMutex);
@@ -191,6 +237,7 @@ eNextState FailAggregationRun(AsyncIO *IO)
 
 eNextState POP3C_ReadGreeting(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        /* Read the server greeting */
        if (!POP3C_OK) return eTerminateConnection;
@@ -199,6 +246,7 @@ eNextState POP3C_ReadGreeting(pop3aggr *RecvMsg)
 
 eNextState POP3C_SendUser(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        /* Identify ourselves.  NOTE: we have to append a CR to each command.
         *  The LF will automatically be appended by sock_puts().  Believe it
         * or not, leaving out the CR will cause problems if the server happens
@@ -213,6 +261,7 @@ eNextState POP3C_SendUser(pop3aggr *RecvMsg)
 
 eNextState POP3C_GetUserState(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        if (!POP3C_OK) return eTerminateConnection;
        else return eSendReply;
@@ -220,16 +269,18 @@ eNextState POP3C_GetUserState(pop3aggr *RecvMsg)
 
 eNextState POP3C_SendPassword(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        /* Password */
        StrBufPrintf(RecvMsg->IO.SendBuf.Buf,
                     "PASS %s\r\n", ChrPtr(RecvMsg->pop3pass));
-       syslog(LOG_DEBUG, "<PASS <password>\n");
+       EVP3CM_syslog(LOG_DEBUG, "<PASS <password>\n");
 //     POP3C_DBG_SEND(); No, we won't write the passvoid to syslog...
        return eReadMessage;
 }
 
 eNextState POP3C_GetPassState(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        if (!POP3C_OK) return eTerminateConnection;
        else return eSendReply;
@@ -237,6 +288,7 @@ eNextState POP3C_GetPassState(pop3aggr *RecvMsg)
 
 eNextState POP3C_SendListCommand(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        /* Get the list of messages */
        StrBufPlain(RecvMsg->IO.SendBuf.Buf, HKEY("LIST\r\n"));
        POP3C_DBG_SEND();
@@ -245,6 +297,7 @@ eNextState POP3C_SendListCommand(pop3aggr *RecvMsg)
 
 eNextState POP3C_GetListCommandState(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        if (!POP3C_OK) return eTerminateConnection;
        RecvMsg->MsgNumbers = NewHash(1, NULL);
@@ -255,6 +308,7 @@ eNextState POP3C_GetListCommandState(pop3aggr *RecvMsg)
 
 eNextState POP3C_GetListOneLine(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
 #if 0
        int rc;
 #endif
@@ -288,14 +342,14 @@ eNextState POP3C_GetListOneLine(pop3aggr *RecvMsg)
 #if 0
        rc = TestValidateHash(RecvMsg->MsgNumbers);
        if (rc != 0)
-               syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
+               EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
 #endif
 
        Put(RecvMsg->MsgNumbers, LKEY(OneMsg->MSGID), OneMsg, HfreeFetchItem);
 #if 0
        rc = TestValidateHash(RecvMsg->MsgNumbers);
        if (rc != 0)
-               syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
+               EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
 #endif
        //RecvMsg->State --; /* read next Line */
        return eReadMore;
@@ -309,7 +363,8 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
        struct cdbdata *cdbut;
        pop3aggr *RecvMsg = (pop3aggr *) IO->Data;
 
-       if(GetNextHashPos(RecvMsg->MsgNumbers,
+       if((RecvMsg->Pos != NULL) &&
+          GetNextHashPos(RecvMsg->MsgNumbers,
                          RecvMsg->Pos,
                          &HKLen,
                          &HKey,
@@ -320,9 +375,9 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
                        return eAbort;
 
                RecvMsg->CurrMsg = (FetchItem*) vData;
-               syslog(LOG_DEBUG,
-                      "CHECKING: whether %s has already been seen: ",
-                      ChrPtr(RecvMsg->CurrMsg->MsgUID));
+               EVP3CCS_syslog(LOG_DEBUG,
+                              "CHECKING: whether %s has already been seen: ",
+                              ChrPtr(RecvMsg->CurrMsg->MsgUID));
 
                /* Find out if we've already seen this item */
                safestrncpy(ut.ut_msgid,
@@ -333,7 +388,7 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
                cdbut = cdb_fetch(CDB_USETABLE, SKEY(RecvMsg->CurrMsg->MsgUID));
                if (cdbut != NULL) {
                        /* Item has already been seen */
-                       syslog(LOG_DEBUG, "YES\n");
+                       EVP3CCSM_syslog(LOG_DEBUG, "YES\n");
                        cdb_free(cdbut);
 
                        /* rewrite the record anyway, to update the timestamp */
@@ -344,7 +399,7 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
                }
                else
                {
-                       syslog(LOG_DEBUG, "NO\n");
+                       EVP3CCSM_syslog(LOG_DEBUG, "NO\n");
                        RecvMsg->CurrMsg->NeedFetch = 1;
                }
                return NextDBOperation(&RecvMsg->IO,
@@ -355,13 +410,14 @@ eNextState POP3_FetchNetworkUsetableEntry(AsyncIO *IO)
                /* ok, now we know them all,
                 * continue with reading the actual messages. */
                DeleteHashPos(&RecvMsg->Pos);
-
+               StopDBWatchers(IO);
                return QueueEventContext(IO, POP3_C_ReAttachToFetchMessages);
        }
 }
 
 eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        long HKLen;
        const char *HKey;
        void *vData;
@@ -370,9 +426,10 @@ eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg)
        int rc;
        rc = TestValidateHash(RecvMsg->MsgNumbers);
        if (rc != 0)
-               syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
+               EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
 #endif
-       if(GetNextHashPos(RecvMsg->MsgNumbers,
+       if((RecvMsg->Pos != NULL) &&
+          GetNextHashPos(RecvMsg->MsgNumbers,
                          RecvMsg->Pos,
                          &HKLen, &HKey,
                          &vData))
@@ -386,7 +443,7 @@ eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg)
        }
        else
        {
-           RecvMsg->State++;
+               RecvMsg->State++;
                DeleteHashPos(&RecvMsg->Pos);
                /// done receiving uidls.. start looking them up now.
                RecvMsg->Pos = GetNewHashPos(RecvMsg->MsgNumbers, 0);
@@ -398,11 +455,12 @@ eNextState POP3C_GetOneMessagID(pop3aggr *RecvMsg)
 
 eNextState POP3C_GetOneMessageIDState(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
 #if 0
        int rc;
        rc = TestValidateHash(RecvMsg->MsgNumbers);
        if (rc != 0)
-               syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
+               EVP3CCS_syslog(LOG_DEBUG, "Hash Invalid: %d\n", rc);
 #endif
 
        POP3C_DBG_READ();
@@ -428,12 +486,14 @@ eNextState POP3C_GetOneMessageIDState(pop3aggr *RecvMsg)
 
 eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        long HKLen;
        const char *HKey;
        void *vData;
 
        RecvMsg->CurrMsg = NULL;
-       while (GetNextHashPos(RecvMsg->MsgNumbers,
+       while ((RecvMsg->Pos != NULL) && 
+              GetNextHashPos(RecvMsg->MsgNumbers,
                              RecvMsg->Pos,
                              &HKLen, &HKey,
                              &vData) &&
@@ -459,6 +519,7 @@ eNextState POP3C_SendGetOneMsg(pop3aggr *RecvMsg)
 
 eNextState POP3C_ReadMessageBodyFollowing(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        if (!POP3C_OK) return eTerminateConnection;
        RecvMsg->IO.ReadMsg = NewAsyncMsg(HKEY("."),
@@ -476,9 +537,9 @@ eNextState POP3C_StoreMsgRead(AsyncIO *IO)
        pop3aggr *RecvMsg = (pop3aggr *) IO->Data;
        struct UseTable ut;
 
-       syslog(LOG_DEBUG,
-              "MARKING: %s as seen: ",
-              ChrPtr(RecvMsg->CurrMsg->MsgUID));
+       EVP3CCS_syslog(LOG_DEBUG,
+                      "MARKING: %s as seen: ",
+                      ChrPtr(RecvMsg->CurrMsg->MsgUID));
 
        safestrncpy(ut.ut_msgid,
                    ChrPtr(RecvMsg->CurrMsg->MsgUID),
@@ -489,7 +550,7 @@ eNextState POP3C_StoreMsgRead(AsyncIO *IO)
                  StrLength(RecvMsg->CurrMsg->MsgUID),
                  &ut,
                  sizeof(struct UseTable) );
-
+       StopDBWatchers(IO);
        return QueueEventContext(&RecvMsg->IO, POP3_C_ReAttachToFetchMessages);
 }
 eNextState POP3C_SaveMsg(AsyncIO *IO)
@@ -511,20 +572,23 @@ eNextState POP3C_SaveMsg(AsyncIO *IO)
        }
        CtdlFreeMessage(RecvMsg->CurrMsg->Msg);
 
+       RecvMsg->count ++;
        return NextDBOperation(&RecvMsg->IO, POP3C_StoreMsgRead);
 }
 
 eNextState POP3C_ReadMessageBody(pop3aggr *RecvMsg)
 {
-       syslog(LOG_DEBUG, "Converting message...\n");
+       AsyncIO *IO = &RecvMsg->IO;
+       EVP3CM_syslog(LOG_DEBUG, "Converting message...");
        RecvMsg->CurrMsg->Msg =
                convert_internet_message_buf(&RecvMsg->IO.ReadMsg->MsgBuf);
-
+       StopClientWatchers(IO, 0);
        return QueueDBOperation(&RecvMsg->IO, POP3C_SaveMsg);
 }
 
 eNextState POP3C_SendDelete(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        if (!RecvMsg->keep) {
                StrBufPrintf(RecvMsg->IO.SendBuf.Buf,
                             "DELE %ld\r\n", RecvMsg->CurrMsg->MSGID);
@@ -538,6 +602,7 @@ eNextState POP3C_SendDelete(pop3aggr *RecvMsg)
 }
 eNextState POP3C_ReadDeleteState(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        RecvMsg->State = GetOneMessageIDState;
        return eReadMessage;
@@ -545,6 +610,7 @@ eNextState POP3C_ReadDeleteState(pop3aggr *RecvMsg)
 
 eNextState POP3C_SendQuit(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        /* Log out */
        StrBufPlain(RecvMsg->IO.SendBuf.Buf,
                    HKEY("QUIT\r\n3)"));
@@ -555,6 +621,7 @@ eNextState POP3C_SendQuit(pop3aggr *RecvMsg)
 
 eNextState POP3C_ReadQuitState(pop3aggr *RecvMsg)
 {
+       AsyncIO *IO = &RecvMsg->IO;
        POP3C_DBG_READ();
        return eTerminateConnection;
 }
@@ -627,9 +694,10 @@ const long POP3_C_ReadTimeouts[] = {
 
 void POP3SetTimeout(eNextState NextTCPState, pop3aggr *pMsg)
 {
+       AsyncIO *IO = &pMsg->IO;
        double Timeout = 0.0;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3C_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
 
        switch (NextTCPState) {
        case eSendFile:
@@ -673,7 +741,7 @@ void POP3SetTimeout(eNextState NextTCPState, pop3aggr *pMsg)
 }
 eNextState POP3_C_DispatchReadDone(AsyncIO *IO)
 {
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+/*     EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); to noisy anyways. */
        pop3aggr *pMsg = IO->Data;
        eNextState rc;
 
@@ -685,10 +753,10 @@ eNextState POP3_C_DispatchReadDone(AsyncIO *IO)
 }
 eNextState POP3_C_DispatchWriteDone(AsyncIO *IO)
 {
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
        pop3aggr *pMsg = IO->Data;
        eNextState rc;
 
+/*     EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__); to noisy anyways. */
        rc = POP3C_SendHandlers[pMsg->State](pMsg);
        POP3SetTimeout(rc, pMsg);
        return rc;
@@ -702,7 +770,7 @@ eNextState POP3_C_Terminate(AsyncIO *IO)
 {
 ///    pop3aggr *pMsg = (pop3aggr *)IO->Data;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
        FinalizePOP3AggrRun(IO);
        return eAbort;
 }
@@ -710,7 +778,7 @@ eNextState POP3_C_TerminateDB(AsyncIO *IO)
 {
 ///    pop3aggr *pMsg = (pop3aggr *)IO->Data;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
        FinalizePOP3AggrRun(IO);
        return eAbort;
 }
@@ -718,7 +786,7 @@ eNextState POP3_C_Timeout(AsyncIO *IO)
 {
        pop3aggr *pMsg = IO->Data;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
        StrBufPlain(IO->ErrMsg, CKEY(POP3C_ReadErrors[pMsg->State]));
        return FailAggregationRun(IO);
 }
@@ -726,7 +794,7 @@ eNextState POP3_C_ConnFail(AsyncIO *IO)
 {
        pop3aggr *pMsg = (pop3aggr *)IO->Data;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
        StrBufPlain(IO->ErrMsg, CKEY(POP3C_ReadErrors[pMsg->State]));
        return FailAggregationRun(IO);
 }
@@ -734,13 +802,13 @@ eNextState POP3_C_DNSFail(AsyncIO *IO)
 {
        pop3aggr *pMsg = (pop3aggr *)IO->Data;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
        StrBufPlain(IO->ErrMsg, CKEY(POP3C_ReadErrors[pMsg->State]));
        return FailAggregationRun(IO);
 }
 eNextState POP3_C_Shutdown(AsyncIO *IO)
 {
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
 ////   pop3aggr *pMsg = IO->Data;
 
 ////pMsg->MyQEntry->Status = 3;
@@ -789,7 +857,7 @@ eNextState POP3_C_ReAttachToFetchMessages(AsyncIO *IO)
 {
        pop3aggr *cpptr = IO->Data;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
 ////???        cpptr->State ++;
        if (cpptr->Pos == NULL)
                cpptr->Pos = GetNewHashPos(cpptr->MsgNumbers, 0);
@@ -802,7 +870,12 @@ eNextState POP3_C_ReAttachToFetchMessages(AsyncIO *IO)
 
 eNextState pop3_connect_ip(AsyncIO *IO)
 {
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       pop3aggr *cpptr = IO->Data;
+
+       if (cpptr->IOStart == 0.0) /* whith or without DNS? */
+               cpptr->IOStart = IO->Now;
+
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
 
        return EvConnectSock(IO,
                             POP3_C_ConnTimeout,
@@ -852,23 +925,17 @@ eNextState pop3_get_one_host_ip_done(AsyncIO *IO)
 eNextState pop3_get_one_host_ip(AsyncIO *IO)
 {
        pop3aggr *cpptr = IO->Data;
-       /*
-        * here we start with the lookup of one host. it might be...
-        * - the relay host *sigh*
-        * - the direct hostname if there was no mx record
-        * - one of the mx'es
-        */
 
-       InitC_ares_dns(IO);
+       cpptr->IOStart = IO->Now;
 
-       syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
+       EVP3CCS_syslog(LOG_DEBUG, "POP3: %s\n", __FUNCTION__);
 
-       syslog(LOG_DEBUG, 
-                     "POP3 client[%ld]: looking up %s-Record %s : %d ...\n",
-                     cpptr->n,
-                     (cpptr->IO.ConnectMe->IPv6)? "aaaa": "a",
-                     cpptr->IO.ConnectMe->Host,
-                     cpptr->IO.ConnectMe->Port);
+       EVP3CCS_syslog(LOG_DEBUG, 
+                      "POP3 client[%ld]: looking up %s-Record %s : %d ...\n",
+                      cpptr->n,
+                      (cpptr->IO.ConnectMe->IPv6)? "aaaa": "a",
+                      cpptr->IO.ConnectMe->Host,
+                      cpptr->IO.ConnectMe->Port);
 
        QueueQuery((cpptr->IO.ConnectMe->IPv6)? ns_t_aaaa : ns_t_a,
                   cpptr->IO.ConnectMe->Host,
@@ -883,7 +950,9 @@ eNextState pop3_get_one_host_ip(AsyncIO *IO)
 
 int pop3_do_fetching(pop3aggr *cpptr)
 {
-       InitIOStruct(&cpptr->IO,
+       AsyncIO *IO = &cpptr->IO;
+
+       InitIOStruct(IO,
                     cpptr,
                     eReadMessage,
                     POP3_C_ReadServerStatus,
@@ -934,11 +1003,12 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data)
        pthread_mutex_lock(&POP3QueueMutex);
        if (GetHash(POP3QueueRooms, LKEY(qrbuf->QRnumber), &vptr))
        {
-               syslog(LOG_DEBUG,
-                             "pop3client: [%ld] %s already in progress.\n",
+               pthread_mutex_unlock(&POP3QueueMutex);
+               EVP3CQ_syslog(LOG_DEBUG,
+                             "pop3client: [%ld] %s already in progress.",
                              qrbuf->QRnumber,
                              qrbuf->QRname);
-               pthread_mutex_unlock(&POP3QueueMutex);
+               return;
        }
        pthread_mutex_unlock(&POP3QueueMutex);
 
@@ -957,10 +1027,10 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data)
        if (server_shutting_down)
                return;
        if (fstat(fd, &statbuf) == -1) {
-               syslog(LOG_DEBUG,
-                      "ERROR: could not stat configfile '%s' - %s\n",
-                      filename,
-                      strerror(errno));
+               EVP3CQ_syslog(LOG_INFO,
+                             "ERROR: could not stat configfile '%s' - %s",
+                             filename,
+                             strerror(errno));
                return;
        }
        if (server_shutting_down)
@@ -969,7 +1039,8 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data)
        if (StrBufReadBLOB(CfgData, &fd, 1, statbuf.st_size, &Err) < 0) {
                close(fd);
                FreeStrBuf(&CfgData);
-               syslog(LOG_DEBUG, "ERROR: reading config '%s' - %s<br>\n",
+               EVP3CQ_syslog(LOG_INFO,
+                             "ERROR: reading config '%s' - %s",
                              filename, strerror(errno));
                return;
        }
@@ -992,7 +1063,6 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data)
                        if (!strcasecmp("pop3client", ChrPtr(CfgType)))
                        {
                                pop3aggr *cptr;
-                               StrBuf *Tmp;
 /*
                                if (Count == NULL)
                                {
@@ -1011,9 +1081,10 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data)
                                cptr->pop3pass =
                                        NewStrBufPlain(NULL, StrLength(Line));
                                cptr->Url = NewStrBuf();
-                               Tmp = NewStrBuf();
+                               cptr->Host =
+                                       NewStrBufPlain(NULL, StrLength(Line));
 
-                               StrBufExtract_NextToken(Tmp, Line, &lPtr, '|');
+                               StrBufExtract_NextToken(cptr->Host, Line, &lPtr, '|');
                                StrBufExtract_NextToken(cptr->pop3user,
                                                        Line,
                                                        &lPtr,
@@ -1032,12 +1103,15 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data)
                                                                        &lPtr,
                                                                        '|');
 
-                               StrBufPrintf(cptr->Url, "pop3://%s:%s@%s/%s",
-                                            ChrPtr(cptr->pop3user),
-                                            ChrPtr(cptr->pop3pass),
-                                            ChrPtr(Tmp),
-                                            ChrPtr(cptr->RoomName));
-                               FreeStrBuf(&Tmp);
+                               StrBufAppendBufPlain(cptr->Url, HKEY("pop3://"), 0);
+                               StrBufUrlescUPAppend(cptr->Url, cptr->pop3user, NULL);
+                               StrBufAppendBufPlain(cptr->Url, HKEY(":"), 0);
+                               StrBufUrlescUPAppend(cptr->Url, cptr->pop3pass, NULL);
+                               StrBufAppendBufPlain(cptr->Url, HKEY("@"), 0);
+                               StrBufAppendBuf(cptr->Url, cptr->Host, 0);
+                               StrBufAppendBufPlain(cptr->Url, HKEY("/"), 0);
+                               StrBufUrlescAppend(cptr->Url, cptr->RoomName, NULL);
+
                                ParseURL(&cptr->IO.ConnectMe, cptr->Url, 110);
 
 
@@ -1082,7 +1156,7 @@ void pop3client_scan_room(struct ctdlroom *qrbuf, void *data)
                                }
                                pthread_mutex_unlock(&RSSQueueMutex);
 #endif
-
+                               cptr->n = Pop3ClientID++;
                                pthread_mutex_lock(&POP3QueueMutex);
                                Put(POP3FetchUrls,
                                    SKEY(cptr->Url),
@@ -1137,7 +1211,7 @@ void pop3client_scan(void) {
        if (doing_pop3client) return;
        doing_pop3client = 1;
 
-       syslog(LOG_DEBUG, "pop3client started");
+       EVP3CQM_syslog(LOG_DEBUG, "pop3client started");
        CtdlForEachRoom(pop3client_scan_room, NULL);
 
        pthread_mutex_lock(&POP3QueueMutex);
@@ -1163,7 +1237,7 @@ void pop3client_scan(void) {
        DeleteHashPos(&it);
        pthread_mutex_unlock(&POP3QueueMutex);
 
-       syslog(LOG_DEBUG, "pop3client ended");
+       EVP3CQM_syslog(LOG_DEBUG, "pop3client ended");
        last_run = time(NULL);
        doing_pop3client = 0;
 }
@@ -1177,6 +1251,13 @@ void pop3_cleanup(void)
        DeleteHash(&POP3QueueRooms);
 }
 
+
+
+void LogDebugEnablePOP3Client(const int n)
+{
+       POP3ClientDebugEnabled = n;
+}
+
 CTDL_MODULE_INIT(pop3client)
 {
        if (!threading)
@@ -1185,8 +1266,9 @@ CTDL_MODULE_INIT(pop3client)
                pthread_mutex_init(&POP3QueueMutex, NULL);
                POP3QueueRooms = NewHash(1, lFlathash);
                POP3FetchUrls = NewHash(1, NULL);
-               CtdlRegisterSessionHook(pop3client_scan, EVT_TIMER);
+               CtdlRegisterSessionHook(pop3client_scan, EVT_TIMER, PRIO_AGGR + 50);
                CtdlRegisterEVCleanupHook(pop3_cleanup);
+               CtdlRegisterDebugFlagHook(HKEY("pop3client"), LogDebugEnablePOP3Client, &POP3ClientDebugEnabled);
        }
 
        /* return our module id for the log */